<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<link rel="shortcut icon" type="image/x-icon" href="favicon.ico"/>
<title>DynamoRIO API: Release Notes for Version 5.0.0</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
  $(document).ready(initResizable);
</script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
  $(document).ready(function() { searchBox.OnSelectItem(0); });
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td style="padding-left: 0.5em;">
   <div id="projectname">DynamoRIO API
   </div>
  </td>
   <td>        <div id="MSearchBox" class="MSearchBoxInactive">
        <span class="left">
          <img id="MSearchSelect" src="search/mag_sel.png"
               onmouseover="return searchBox.OnSearchSelectShow()"
               onmouseout="return searchBox.OnSearchSelectHide()"
               alt=""/>
          <input type="text" id="MSearchField" value="Search" accesskey="S"
               onfocus="searchBox.OnSearchFieldFocus(true)" 
               onblur="searchBox.OnSearchFieldFocus(false)" 
               onkeyup="searchBox.OnSearchFieldChange(event)"/>
          </span><span class="right">
            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
          </span>
        </div>
</td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.1.1 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
  <div id="nav-tree">
    <div id="nav-tree-contents">
    </div>
  </div>
  <div id="splitbar" style="-moz-user-select:none;" 
       class="ui-resizable-handle">
  </div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('release_notes.html','');});
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Data Structures</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark">&#160;</span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(8)"><span class="SelectionMark">&#160;</span>Macros</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(9)"><span class="SelectionMark">&#160;</span>Groups</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(10)"><span class="SelectionMark">&#160;</span>Pages</a></div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div class="header">
  <div class="headertitle">
<div class="title">Release Notes for Version 5.0.0 </div>  </div>
</div><!--header-->
<div class="contents">
<div class="textblock"><p>This section is divided into the following subsections:</p>
<ul>
<li><a class="el" href="release_notes.html#sec_package">Distribution Contents</a></li>
<li><a class="el" href="release_notes.html#sec_changes">Changes Since Prior Releases</a></li>
<li><a class="el" href="release_notes.html#sec_limits">Limitations</a></li>
<li><a class="el" href="release_notes.html#sec_future">Plans for Future Releases</a></li>
</ul>
 
<table width=100% bgcolor="#000000" cellspacing=0 cellpadding=2 border=0>
  <tr><td><table width=100% bgcolor="#0000C0" cellspacing=0 cellpadding=1 border=0>
  <tr><td><table width=100% bgcolor="#0000C0" cellspacing=0 cellpadding=1 border=0>
  <tr><td></td></tr></table></td></tr></table></td></tr></table>
 <h1><a class="anchor" id="sec_package"></a>
Distribution Contents</h1>
<p>The following are part of the DynamoRIO release distribution:</p>
<ul>
<li>Four different DynamoRIO libraries: debug and release for each of 32-bit and 64-bit. The debug library enables assertion messages to more easily diagnose API usage errors.</li>
<li>Four different IA-32/AMD64 decoding static libraries: debug and release for each of 32-bit and 64-bit. The debug library enables assertion messages to more easily diagnose API usage errors.</li>
<li>A variety of DynamoRIO Extension libraries that augment the core DynamoRIO API (see <a class="el" href="page_ext.html">DynamoRIO Extensions</a>).</li>
<li>Additional Extension libraries from the Dr. Memory Framework (DRMF). If this documentation is part of a DynamoRIO public release, <a href="../../drmemory/drmemory/docs/html/page_drmf.html">this link</a> should point at the local documentation for DRMF.</li>
<li>The DynamoRIO configuration and execution libraries and command-line utilities <code>drconfiglib.dll</code>, <code>drinjectlib.dll</code>, <code>drfrontendlib.dll</code>, <code>drconfig.exe</code>, <code>drrun.exe</code>, and <code>drinject.exe</code>. On Linux, the tools are named <code>drconfig</code>, <code>drrun</code>, and <code>drinject</code>.</li>
<li>A utility <code>drview.exe</code> for viewing which processes are running under DynamoRIO control (Windows package only).</li>
<li>Header files for the DynamoRIO APIs.</li>
<li>This documentation.</li>
<li><a class="el" href="API_samples.html">Sample clients</a>.</li>
<li>A graphical statistics viewer <code>DRstats.exe</code> that displays internal DynamoRIO statistics as well as custom statistics defined by a client (see <a class="el" href="API_samples.html#sec_ex7">Use of Custom Client Statistics with the Windows GUI</a>) (Windows package only). DynamoRIO exports a large number of statistics in its debug build, and a handful in release builds.</li>
<li>A binary tracedump reader, which also functions as a sample client using DynamoRIO as a standalone library (see <a class="el" href="page_standalone.html#sec_standalone">Using DynamoRIO as a Standalone Library</a>).</li>
<li>A number of end-user tools including a code coverage tool (see <a class="el" href="page_drcov.html">Code Coverage Tool</a>) and a library tracing tool (see <a class="el" href="page_drltrace.html">Library Tracing Tool</a>). If this is a DynamoRIO public release, it also includes the Dr. Memory memory debugging tool (see <a class="el" href="page_drmemory.html">Dr. Memory Memory Debugging Tool</a>), a system call tracer for Windows (see <a class="el" href="page_drstrace.html">System Call Tracer for Windows</a>), and a symbol querying tool (see <a class="el" href="page_symquery.html">Symbol Query Tool</a>).</li>
</ul>
<p>When unpacking the release package on Windows, be aware that the Cygwin unzip utility does not preserve executable permissions properly. After unzipping with Cygwin, add ugo+rx permissions to all of the .dll and .exe files in the resulting directory tree: </p>
<div class="fragment"><div class="line">find . -name \*.dll -exec chmod ugo+rx {} \; -o -name \*.exe -exec chmod ugo+rx {} \;</div>
</div><!-- fragment --> 
<table width=100% bgcolor="#000000" cellspacing=0 cellpadding=2 border=0>
  <tr><td><table width=100% bgcolor="#0000C0" cellspacing=0 cellpadding=1 border=0>
  <tr><td><table width=100% bgcolor="#0000C0" cellspacing=0 cellpadding=1 border=0>
  <tr><td></td></tr></table></td></tr></table></td></tr></table>
 <h1><a class="anchor" id="sec_changes"></a>
Changes Since Prior Releases</h1>
<p>The current version is 5.0.0.</p>
<p>Version 5.0.0 includes Dr. Memory and the Dr. Memory Framework (DRMF) in the same package as DynamoRIO. DRMF provides the umbra, drsyscall, and drsymcache Extensions for use by clients.</p>
<p>The changes between version 5.0.0 and 4.2.0 also include the following minor compatibility changes:</p>
<ul>
<li>Dropped official support for Windows 2000. The core DynamoRIO engine should continue to work there, but the official release package will not run on Windows 2000.</li>
<li>Changed the third parameter to <a class="el" href="group__drsyms.html#ga5a983d39217af0f8a39868c66e0646d0">drsym_search_symbols_ex()</a> from a bool to a uint flags in order to take in demangling flags. Binary compatibility is maintained as drsym_info_t's size was changed, but source compatibility is affected by this change.</li>
<li>Added collapsing of template parameters to "&lt;&gt;" for drsyms operations on Windows PDB symbols when <a class="el" href="group__drsyms.html#gga0b67aaba18a6215dfc1ff4c68b57d41ea85d6e34c4fcb68eb97a07774102c4b0e">DRSYM_DEMANGLE</a> is specified. This can be undone by specifying <a class="el" href="group__drsyms.html#gga0b67aaba18a6215dfc1ff4c68b57d41eaf5d562cfc61f955bb16455e199dc167e">DRSYM_DEMANGLE_PDB_TEMPLATES</a>.</li>
<li>Removed empty parentheses "()" from partially-demangled symbols (when <a class="el" href="group__drsyms.html#gga0b67aaba18a6215dfc1ff4c68b57d41ea85d6e34c4fcb68eb97a07774102c4b0e">DRSYM_DEMANGLE</a> is specified) for <a class="el" href="group__drsyms.html#ggad3772ffd6c4e0d68738a31d7e25a3de9af9680fa1e5316576914fd50d253016da">DRSYM_ELF_SYMTAB</a> and <a class="el" href="group__drsyms.html#ggad3772ffd6c4e0d68738a31d7e25a3de9a0ef6cab1fee912683e2c99498492979b">DRSYM_PECOFF_SYMTAB</a>. Windows and Linux symbols are now consistent for <a class="el" href="group__drsyms.html#gga0b67aaba18a6215dfc1ff4c68b57d41ea85d6e34c4fcb68eb97a07774102c4b0e">DRSYM_DEMANGLE</a>.</li>
<li>Changed the operand sizes of instructions that read or write only part of a multimedia register (mmx, xmm, or ymm) to reflect the partial size.</li>
<li>Added return value for dr_fprintf to indicate how many bytes are written.</li>
<li>Renamed the function add_rel_rpaths() in DynamoRIOConfig.cmake to DynamoRIO_add_rel_rpaths().</li>
<li>Deprecated <a class="el" href="dr__ir__instr_8h.html#a95454ba978870e70aa6b882155c4dabd">instr_ok_to_mangle()</a> and <a class="el" href="dr__ir__instr_8h.html#a2335bd8d05936e8308506ef11f1be401">instr_set_ok_to_mangle()</a> (replaced with <a class="el" href="dr__ir__instr_8h.html#a5e6d7eea24e55c4a4851ab4e3c0aa108">instr_is_app()</a>, <a class="el" href="dr__ir__instr_8h.html#ad03f60b3110fcbd793381245bed502be">instr_is_meta()</a>, <a class="el" href="dr__ir__instr_8h.html#ab7d47ceb0c0c0b5f50b78346c85a7f47">instr_set_app()</a>, and <a class="el" href="dr__ir__instr_8h.html#ad0919782b67d3918ec6feb838e373f15">instr_set_meta()</a>).</li>
</ul>
<p>Further non-compatibility-affecting changes include:</p>
<ul>
<li>Added <a class="el" href="dr__tools_8h.html#a0e4cf94bfc4dca2deb04699c28a56e55">dr_syscall_get_result_ex()</a> and <a class="el" href="dr__tools_8h.html#aaae7ca4aa76652ddaaacb1e8dad9f6af">dr_syscall_set_result_ex()</a> for future MacOS support.</li>
<li>Added Mach-O support to drsyms.</li>
<li>Added <a class="el" href="dr__ir__macros_8h.html#aaf22f1a7df81230103983b562c261b18">INSTR_CREATE_cmpxchg_8()</a> for 64-bit cmpxchg</li>
<li>Changed the default -stderr_mask on Windows to 0xC (for both release and debug), and the default -msgbox_mask on Windows release builds to 0xC, for better error reporting. For interactive runs, then, the user should explicitly pass -msgbox_mask 0.</li>
<li>Added a flags output parameter to <a class="el" href="group__drsyms.html#gac7ae60d7c499c017414574b22d6d4879">drsym_info_t</a>.</li>
<li>Added <a class="el" href="dr__tools_8h.html#a3cac1e57889ba7d16815d8d3b203f256">dr_module_contains_addr()</a> to make handling non-contiguous libraries easier.</li>
<li>Added <a class="el" href="group__drcontainers.html#gac15c2ca65b95597ff2311f1040f1be53">hashtable_lock_self_owns()</a> to the drcontainers Extension.</li>
<li>Added <a class="el" href="dr__ir__opnd_8h.html#a321271ddce2b40d5a094aa22fdfdeb0b">opnd_create_reg_partial()</a> and <a class="el" href="dr__ir__opnd_8h.html#ad8e257fb364af0aed0c0be066d8d1da3">opnd_is_reg_partial()</a> for representing a partial multimedia register</li>
<li>Added operand size suffixes on disassembly in the default mode. This can be disabled via -disasm_mask 0x8 or by calling disassemble_set_syntax(DR_DISASM_NO_OPND_SIZE).</li>
<li>Added <a class="el" href="dr__ir__instr_8h.html#a785671aba1adec0f47add596f7e6a440">instr_zeroes_ymmh()</a>.</li>
<li>Added new fields to module_data_t: timestamp for Linux and MacOS, and version and uuid fields for MacOS.</li>
<li>Added a new library drfrontendlib to be used for building tool front-ends. For more information see <a class="el" href="dr__frontend_8h.html" title="Tool front-end API. Use these functions to search for and query the properties of a target applicatio...">dr_frontend.h</a>.</li>
<li>Added <a class="el" href="dr__tools_8h.html#a9e70d60b5c4963fa277e27efc0482a60">dr_create_memory_dump()</a>.</li>
<li>Added <a class="el" href="dr__ir__utils_8h.html#a5d0a400c44ffafbfa027884b5f895342">dr_mcontext_to_context()</a>.</li>
<li>Added <a class="el" href="dr__ir__utils_8h.html#a4473973127fba8a57f1a4ba409c6938a">dr_call_on_clean_stack()</a>.</li>
<li>Added <a class="el" href="dr__tools_8h.html#a401eb84af927fa3bd1358f6b639ec592">dr_set_client_name()</a> for customizing the diagnostic message presented to users when an error occurs or when <a class="el" href="dr__tools_8h.html#ad444a204e7ca45f9965cfe973470375a">dr_messagebox()</a> is called.</li>
<li>Added <a class="el" href="dr__ir__instr_8h.html#a1114903afc8f9a3539aed43330117627">instr_get_next_app()</a> and <a class="el" href="dr__ir__instrlist_8h.html#a7facdfdbc94dff0029e1c7a0be55a934">instrlist_first_app()</a> to allow clients to traverse only application (non-meta) instructions.</li>
<li>Added <a class="el" href="dr__config_8h.html#a28e562c5d7cd81fd4904224fce15f7a6">dr_config_status_code_to_string()</a>.</li>
<li>Added custom tool front-end launching support to drrrun tool config files.</li>
<li>Added a tool notification feature to drrun tool config files.</li>
<li>Added get_visualstudio_info() for looking up visual studio installation information.</li>
<li>Renamed the strace sample to "syscall" and removed its tracing feature, in favor of a superior strace sample inside DRMF.</li>
<li>Included a copy of dbghelp.dll for drsyms</li>
<li>Added <a class="el" href="dr__ir__utils_8h.html#a73e0fdfd7cf230aff575191bd49da893">dr_insert_cbr_instrumentation_ex()</a>, which provides the fall-through address.</li>
<li>Added <a class="el" href="dr__ir__instr_8h.html#a5e6d7eea24e55c4a4851ab4e3c0aa108">instr_is_app()</a>, <a class="el" href="dr__ir__instr_8h.html#ad03f60b3110fcbd793381245bed502be">instr_is_meta()</a>, <a class="el" href="dr__ir__instr_8h.html#ab7d47ceb0c0c0b5f50b78346c85a7f47">instr_set_app()</a>, and <a class="el" href="dr__ir__instr_8h.html#ad0919782b67d3918ec6feb838e373f15">instr_set_meta()</a>.</li>
<li>Added <a class="el" href="dr__ir__opnd_8h.html#a2ee18e02a6c4c52b1a83c7ebda0805d6">reg_get_value_ex()</a>.</li>
</ul>
<hr/>
 The changes between version 4.2.0 and 4.1.0 include:</p>
<ul>
<li>Added preliminary Windows 8.1 support</li>
<li>Added a new <a class="el" href="page_drltrace.html">Library Tracing Tool</a></li>
<li>Re-branded our <a class="el" href="page_drcov.html">Code Coverage Tool</a></li>
<li>Added an export iterator: <a class="el" href="dr__tools_8h.html#adaa00ccf3ea50bcfa7bb7623565bfb41">dr_symbol_export_iterator_start()</a>, <a class="el" href="dr__tools_8h.html#a9913028815c4a9f76a14871b9f1d74d3">dr_symbol_export_iterator_hasnext()</a>, <a class="el" href="dr__tools_8h.html#a84a9316bfb47fb3a854bf371da4e2190">dr_symbol_export_iterator_next()</a>, <a class="el" href="dr__tools_8h.html#a3ab1fb16deb7bdec1216e61bbc265cdb">dr_symbol_export_iterator_stop()</a></li>
<li>Added relative directory support to file routines on Windows</li>
<li>Added <a class="el" href="dr__tools_8h.html#aae2e62195a2732b0f5c1004138b800a6">dr_get_current_directory()</a></li>
<li>Added <a class="el" href="dr__tools_8h.html#aab0da447546ca8dd194a993607d66ecb">dr_delete_dir()</a></li>
<li>Added <a class="el" href="group__drx.html#gaa0a5fcca247de11374c3555a5326cba8">drx_open_unique_file()</a> and <a class="el" href="group__drx.html#gaa85537dd6726928bbd43a21dc8211a53">drx_open_unique_appid_file()</a></li>
<li>Added <a class="el" href="dr__proc_8h.html#a3039c377f1b296cd8be453957f95c103">proc_avx_enabled()</a></li>
<li>Added support for recent IA-32/AMD64 instructions: the rdrand, fsgsbase, FMA4, XOP, TBM, LWP, BMI1, BMI2, SMX, INVPCID, TSX, and AVX2 instruction groups</li>
<li>Added vector addressing (VSIB) support to <a class="el" href="dr__ir__instr_8h.html#aa13ec559a17ab70816f80de784e5632f">instr_compute_address()</a>, <a class="el" href="dr__ir__instr_8h.html#aa04322a189dd7f17ab245594e02cc6a8">instr_compute_address_ex()</a> and <a class="el" href="dr__ir__instr_8h.html#a25107e1fb5a49de3c627b70acc7b2eef">instr_compute_address_ex_pos()</a></li>
<li>Added <a class="el" href="dr__ir__opnd_8h.html#acdea9def1c35fc3e62d53dd0154aa8c4">opnd_is_vsib()</a></li>
<li>Fixed misnamed opcodes: OP_pmovsxdw is now OP_pmovsxwd, OP_pmovzxdw is now OP_pmovzxwd, OP_vpmovsxdw is now OP_vpmovsxwd, and OP_vpmovzxdw is now OP_vpmovzxwd.</li>
<li>Renamed DRgui to DRstats in anticipation of a new DRgui graphical tool framework</li>
<li><a class="el" href="dr__tools_8h.html#a364db17ca1ba042f4fa3280b49fb2ad6">dr_exit_process()</a> now supports sending a fatal signal via the 2nd byte of the exit code being set to the signal number</li>
<li>Added a return value of NULL to <a class="el" href="dr__tools_8h.html#af63184f56cc0508e2840f64e84b1c48d">dr_standalone_init()</a> to indicate failure, such as running on an unsupported OS</li>
<li>Added a "soft kills" feature to the <code>drx</code> Extension via <a class="el" href="group__drx.html#ga9348e840424caf0098a8b1ba69955864">drx_register_soft_kills()</a> to avoid child process termination preventing output of instrumentation results</li>
<li>Added <a class="el" href="dr__tools_8h.html#a9593c7e9b66e2020ebaea7e3911f2e22">dr_convert_pid_to_handle()</a></li>
<li>Added <a class="el" href="dr__tools_8h.html#ae3747468d00df5cdc597688e1e079a64">dr_syscall_intercept_natively()</a></li>
<li>Added <a class="el" href="dr__app_8h.html#aba46eea03a20e5801b87b7cd54d26bf5">dr_app_handle_mbr_target()</a></li>
<li>Added <a class="el" href="dr__app_8h.html#aea917a6c24c8bf526f77772b0b9848a8">dr_app_running_under_dynamorio()</a></li>
<li>Added <a class="el" href="group__drcontainers.html#ga70494a642307dd41ad8b6a754fcea9c8">drvector_set_entry()</a></li>
<li>Re-ordered the initial thread init event to be prior to the initial module load events</li>
<li>Changed DynamoRIO_USE_LIBC to be on by default for all clients, including clients written in C</li>
<li>Added static library versions of most Extension libraries: drmgr_static, drutil_static, drwrap_static, drsyms_static, and drx_static. Be sure to check the licenses and other restrictions (in particular, most of these Extensions will not work properly if duplicated) before using these static versions.</li>
<li>Various bug fixes</li>
</ul>
<hr/>
 The changes between version 4.1.0 and 4.0.1 include the following compatibility changes:</p>
<ul>
<li>The <a class="el" href="group__drsyms.html#gac7ae60d7c499c017414574b22d6d4879">drsym_info_t</a> data structure has changed. The file name is now a caller-allocated buffer, and it and the symbol name are separated out. This affects code that calls <a class="el" href="group__drsyms.html#ga201e8a9bf6746cbfd232bc4e4a243d2b">drsym_lookup_address()</a>.</li>
<li>Memory allocated through system libraries (including malloc, operator new, and HeapAlloc) is not guaranteed to be reachable by a 32-bit displacement from the code cache: only memory directly allocated via DR's API. The <a class="el" href="using.html#op_reachable_heap">-reachable_heap runtime option</a> can be used to guarantee that all memory is reachable.</li>
<li>For 64-bit, the opcode constants OP_fxsave, OP_fxrstor, OP_xsave, OP_xrstor, and OP_xsaveopt have all been replaced with two versions: one with a "32" suffix and one with a "64" suffix. E.g., OP_fxsave is split into <a class="el" href="dr__ir__opcodes_8h.html#aae05225933a42f81e7c4a9fb286596f9a111bfd882f3c659431fdf8fb3ab5c0a3">OP_fxsave32</a> and <a class="el" href="dr__ir__opcodes_8h.html#aae05225933a42f81e7c4a9fb286596f9a3eba626fc423adfcaad47c784bf36eca">OP_fxsave64</a>. The 32 version corresponds to the no-suffix assembler mnemonic while the 64 version coresponds to the assembler mnemonic of the same name. Previously, the 64-bit versions of these instrutions could not be distinguished nor encoded from scratch.</li>
</ul>
<p>Further non-compatibility-affecting changes include:</p>
<ul>
<li>Added <a class="el" href="dr__ir__instr_8h.html#ac609abca95ab7f30d7f289f5dd19fdad">instr_is_floating_ex()</a></li>
<li>Ported the stats.c sample and DRgui to 64-bit. As part of this, the shared memory structure changed shape on Windows: pid is now of type process_id_t.</li>
<li>Added the <code>drtable</code> Extension which provides simple table management</li>
<li>Added <a class="el" href="dr__ir__opnd_8h.html#ac0dbb90e9aef096dd298a1fc35dffe83">opnd_size_from_bytes()</a></li>
<li>Added path searching support to <a class="el" href="dr__tools_8h.html#a94c8a2e52880f44d43402d6b0d686db2">dr_load_aux_library()</a></li>
<li>Added limited, experimental support for 32-bit WOW64 clients to use 64-bit libraries and code via dr_load_aux_x64_library(), dr_lookup_aux_x64_library_routine(), dr_unload_aux_x64_library(), and dr_invoke_x64_routine().</li>
<li>Added <a class="el" href="group__drmgr.html#ga75f5e22831cb18cb7fbb8316cd56f09f">drmgr_current_bb_phase()</a></li>
<li>The deployment tools (drrun, drconfig, and drinject) are now helper binaries instead of shell scripts.</li>
<li>The deployment tools (drrun etc.) now interpret -v as an alias for -verbose and use -version to print version info.</li>
<li>Added <a class="el" href="dr__events_8h.html#a01cf5156d74cebff5bcf78a3dc0368a6">instrlist_insert_mov_immed_ptrsz()</a> and <a class="el" href="dr__events_8h.html#a5090f76aaf78dbcb3f07c7a345c38f18">instrlist_insert_push_immed_ptrsz()</a></li>
<li>Added <a class="el" href="dr__events_8h.html#a0576d14a61e116a9608700c492ac9c32">instrlist_insert_mov_instr_addr()</a> and <a class="el" href="dr__events_8h.html#ad2fd93ab0ee30ad46280a08bc5876133">instrlist_insert_push_instr_addr()</a></li>
<li>Added <a class="el" href="group__drsyms.html#ga01b46346170fbc4580d2e4fb5c4ba616">drsym_enumerate_lines()</a></li>
<li>Added <a class="el" href="dr__ir__utils_8h.html#a4c1e2fa2049719870ad0c1007b00d4e3aa9e5caa6773c8f8a4ff13b77231dbdaf">DR_DISASM_STRICT_INVALID</a></li>
<li>Added a new runtime option <a class="el" href="using.html#op_syntax_att">-syntax_att</a> for AT&amp;T-style disassembly that hides the implicit operands. Also added <a class="el" href="dr__ir__utils_8h.html#a4c1e2fa2049719870ad0c1007b00d4e3af82d1bee9aa93ac6df451bd80a4b1278">DR_DISASM_DR</a> to name DR's default disassembly style, with <a class="el" href="dr__ir__utils_8h.html#a4c1e2fa2049719870ad0c1007b00d4e3a83d3ece1134b8dabc7f0fd2f84185f11">DR_DISASM_ATT</a> selecting a true AT&amp;T disassembly style that hides implicit operands. The only compatibility change here is if a client selected DR_DISASM_ATT and expected DR-style disassembly.</li>
<li>Added <a class="el" href="dr__tools_8h.html#ae4d5251432e1a9e6803c0240cc492e18a12a6a7af3936e4c932effc9505f23be5">DR_MAP_IMAGE</a></li>
<li>Added -t option to drrun for end-user tools</li>
<li>Added 64-bit reachability support to <a class="el" href="dr__ir__utils_8h.html#af2a3575059c29dae25ab02c9eb1d0ce9">dr_insert_call()</a> and <a class="el" href="dr__ir__utils_8h.html#ae7b7bd1e750b8a24ebf401fb6a6d6d5e">dr_insert_clean_call()</a>. Added explicit control over reachability in a new routine <a class="el" href="dr__ir__utils_8h.html#a5da72f3ac1f72d1abd12184d66b83f32">dr_insert_call_ex()</a> and in <a class="el" href="dr__ir__utils_8h.html#af1b1bc23c42ffb7452568176b09b1212a9fe53fc77afb460ba31666995df5b6c9">DR_CLEANCALL_INDIRECT</a> for <a class="el" href="dr__ir__utils_8h.html#a8640a5d47dcf82be4e6a5cf77bd6d967">dr_insert_clean_call_ex()</a>.</li>
<li>Added auto-magic conversion of absolute and pc-relative memory operands to each other for more flexible 64-bit encoding.</li>
<li>Added <a class="el" href="dr__ir__opnd_8h.html#a473c30663f325c09134371863f8f237a">opnd_create_instr_ex()</a> and <a class="el" href="dr__ir__opnd_8h.html#aa15b1fcb0d983e84c95717d34f4ba223">opnd_get_shift()</a></li>
<li>Added <a class="el" href="dr__tools_8h.html#a3cfff0780cf83588e3d71da552490eb7">dr_custom_alloc()</a></li>
<li>Added <a class="el" href="dr__tools_8h.html#a83555066ac1477ba607bee5f34626d35">dr_raw_mremap()</a> and <a class="el" href="dr__tools_8h.html#a6c9e86d9d052e7b4f6d47402185fbb79">dr_raw_brk()</a></li>
<li>Added <a class="el" href="dr__events_8h.html#a689518ac5d1ad136b13e03012702b209a184a564eaa6cee9890f98f8a2d1c9c89">DR_EMIT_GO_NATIVE</a>, <a class="el" href="dr__tools_8h.html#a8c0a1bdefb011cf62eb2540e933cb331">dr_suspend_all_other_threads_ex()</a>, <a class="el" href="dr__tools_8h.html#a36206cb11622f8c9aee12016e916a190">dr_retakeover_suspended_native_thread()</a>, and <a class="el" href="dr__tools_8h.html#a9f74b6f40f9462fe077f4b2cabc6b933">dr_is_thread_native()</a> for temporarily-native support.</li>
<li>Added <a class="el" href="dr__tools_8h.html#ae5567896b7c8fb25bff984fc6717f566">dr_get_token()</a></li>
<li>Added <a class="el" href="dr__tools_8h.html#ae937ce8bbb24330c25acd6d1c04cb5a0">dr_switch_to_app_state_ex()</a> and <a class="el" href="dr__tools_8h.html#a994e632ea892a947612b44027467ea2b">dr_switch_to_dr_state_ex()</a></li>
<li>Added <a class="el" href="dr__events_8h.html#a2ef0822d6e77a04938787cf398992592">dr_is_nudge_thread()</a></li>
<li>Added support for nudging 64-bit Windows applications</li>
<li>Added <a class="el" href="dr__tools_8h.html#a820a6c60659ad40d59f7b574d671574d">dr_get_dr_thread_handle()</a></li>
<li>Added <a class="el" href="dr__tools_8h.html#aff97be516bbb1aecdb6bd043841aaa10aa23ff267355a0b49da1b77da5bcc4d29">DR_MEMTYPE_RESERVED</a> to <a class="el" href="dr__tools_8h.html#a2834876d9bbe13989ed6ebc2e2f94c6a">dr_mem_info_t</a></li>
<li><a class="el" href="dr__proc_8h.html#a4a11c9d5d127ce126562ad35b4d165dd">proc_save_fpstate()</a>, <a class="el" href="dr__proc_8h.html#a23edceee5d1ae7c7d51a212432e6d644">proc_restore_fpstate()</a>, <a class="el" href="dr__proc_8h.html#aac57f229cefee3abdc6a45dfa37557f6">dr_insert_save_fpstate()</a>, and <a class="el" href="dr__proc_8h.html#ae2f93e0bd2ccdd9e1fe15752198e6c57">dr_insert_restore_fpstate()</a> now use the current thread's x86 mode to determine which fxsave state format to use.</li>
<li>Added partial support for presenting the proper floating point program counter when floating point state is saved. Xref the <a class="el" href="using.html#op_translate_fpu_pc">-translate_fpu_pc runtime option</a>.</li>
<li>Added <code>drx</code> Extension: the DynamoRIO Instrumentation Utility Extension with BSD license</li>
<li>Added automatic restarting of appropriate system calls interrupted by signals.</li>
<li>Various bug fixes</li>
</ul>
<hr/>
 The changes between version 4.0.1 and 4.0.0 include:</p>
<ul>
<li>Fixed a bug resulting in large 64-bit applications failing to allocate heap (Issue 1041)</li>
</ul>
<hr/>
 The changes between version 4.0.0 and 3.2.0 include a compatibility change in the drsyms Extension:</p>
<ul>
<li>Changed the drsyms type query data structures (<a class="el" href="group__drsyms.html#ga75abd525d4d1710196d18d7c13b4c061">drsym_type_t</a>, <a class="el" href="group__drsyms.html#ga3de06a92ea1be03694869f4f38045938">drsym_func_type_t</a>, <a class="el" href="group__drsyms.html#ga9075a62cb47f48762911d8cd7c683035">drsym_int_type_t</a>, <a class="el" href="group__drsyms.html#ga6536ad3236ff3d06eeeaf1450cb77b79">drsym_ptr_type_t</a>). This is a binary compatibility change for <a class="el" href="group__drsyms.html#ga676bf63e860bca8a8eb3a7fe7e0dfa00">drsym_get_func_type()</a>.</li>
</ul>
<p>And in the drmgr Extension:</p>
<ul>
<li>The post-syscall, module load, module unload, signal, exception, and restore state events are now mediated and ordered by drmgr. Thus, clients should call <a class="el" href="group__drmgr.html#ga7070ea3233d022ebf272b43a3301d130">drmgr_register_post_syscall_event()</a> (for a default priority) or <a class="el" href="group__drmgr.html#ga06a8b25b80a61e09cacaee10b6e4ef06">drmgr_register_post_syscall_event_ex()</a> (to specify a priority) rather than <a class="el" href="dr__events_8h.html#a099441f8d147404355c66178e3b19f0f">dr_register_post_syscall_event()</a>. The same applies to <a class="el" href="group__drmgr.html#gaae5e551a1571aca43c136a83fe334096">drmgr_register_module_load_event()</a> + <a class="el" href="group__drmgr.html#gaa14585b60c28600872f76b5e2939d638">drmgr_register_module_load_event_ex()</a>, <a class="el" href="group__drmgr.html#ga00e82d90a74f1f3bc87cfdaef45811c2">drmgr_register_module_unload_event()</a> + <a class="el" href="group__drmgr.html#ga852887c851db019e48cf00e232cf23ef">drmgr_register_module_unload_event_ex()</a>, <a class="el" href="group__drmgr.html#ga984ae18ed26a72c84a0fcaaaf44e2343">drmgr_register_signal_event()</a> + <a class="el" href="group__drmgr.html#ga81409344987ecb2ffcf08370d4a1145d">drmgr_register_signal_event_ex()</a>, <a class="el" href="group__drmgr.html#gadd41d491993daae9eb5bc136a8971d09">drmgr_register_exception_event()</a> + <a class="el" href="group__drmgr.html#gacf08ce7f3eab30d8c9aa0580840c569f">drmgr_register_exception_event_ex()</a>, and <a class="el" href="group__drmgr.html#ga0ffa6aa4d9af18a42e98d15b4f82bb20">drmgr_register_restore_state_event()</a> + <a class="el" href="group__drmgr.html#gaf52f88ecf793967022bddd447c65e66f">drmgr_register_restore_state_ex_event()</a> + <a class="el" href="group__drmgr.html#gabbba95c12df79ff5b4ceab3c516ded92">drmgr_register_restore_state_ex_event_ex()</a>.</li>
</ul>
<p>And in the core API:</p>
<ul>
<li><a class="el" href="dr__tools_8h.html#a4b187636a3fc9ba7964ae11a7fd30fb6">dr_get_milliseconds()</a> now returns the number of milliseconds since Jan 1, 1601 on all platforms.</li>
</ul>
<p>And in the non-core APIs:</p>
<ul>
<li><a class="el" href="dr__inject_8h.html#a77b0c082257a96deebb67ad23f381426">dr_inject_process_create()</a> now takes a NULL-terminated array of strings for the app command line to better support porting to Linux.</li>
</ul>
<p>Further non-compatibility-affecting changes include:</p>
<ul>
<li>Added preliminary Windows 8 support, though private kernelbase.dll is not yet supported</li>
<li>Added persistent cache support for clients via <a class="el" href="dr__events_8h.html#a816faa7f555a3b53c4c8a79e3ce9f299">dr_register_persist_ro()</a>, <a class="el" href="dr__events_8h.html#a85e4007d8a1b7bba06809d97573fd84a">dr_register_persist_rx()</a>, <a class="el" href="dr__events_8h.html#a47da83a410ee40275f92cb68de55d4aa">dr_register_persist_rw()</a>, <a class="el" href="dr__events_8h.html#a30d782573b0448ce83fe6509e322629b">dr_register_persist_patch()</a>, and <a class="el" href="dr__events_8h.html#a689518ac5d1ad136b13e03012702b209a8c6fbffdec0fe74acaf82d530ae03b00">DR_EMIT_PERSISTABLE</a>. However, <a class="el" href="dr__events_8h.html#a30d782573b0448ce83fe6509e322629b">dr_register_persist_patch()</a> is still experimental, is in flux, and is subject to change in the next release.</li>
<li>Added hashtable persistence support via <a class="el" href="group__drcontainers.html#gab3d52ff455ac9bab9ef5ffe49586e904">hashtable_persist_size()</a>, <a class="el" href="group__drcontainers.html#ga012f1fb1127c60d90bd76d662c3dbf4a">hashtable_persist()</a>, and <a class="el" href="group__drcontainers.html#ga5857998e61b2477997fad25adf71580b">hashtable_resurrect()</a></li>
<li>Added <a class="el" href="group__drsyms.html#ga6b5e419be145c6956e796dbf3da1678d">drsym_get_type()</a>, <a class="el" href="group__drsyms.html#ga211ebdc7a540e7894a741aac8b2fc808">drsym_expand_type()</a>, and support for additional type categories for Windows drsyms.</li>
<li>Ported the drinjectlib and drconfiglib libraries to Linux. Routines that are still Windows-only are marked in the API docs.</li>
<li>Added <a class="el" href="dr__inject_8h.html#a4acf52ec4bc354ad729dd7e580e5ffb0">dr_inject_prepare_to_exec()</a> on Linux</li>
<li>Added <a class="el" href="group__drsyms.html#gaf3fc654dfbb2d1e1717ee60229d7ac9f">drsym_free_resources()</a></li>
<li>Added <a class="el" href="group__drsyms.html#ga88e18dc10941953589e1023d61ba0a57">drsym_module_has_symbols()</a></li>
<li>Added a type_id field to drsym_info_t (without compatibility changes)</li>
<li>Added <a class="el" href="group__drsyms.html#gad883ab113dd57f77db0c279de2c055f8">drsym_enumerate_symbols_ex()</a> and <a class="el" href="group__drsyms.html#ga5a983d39217af0f8a39868c66e0646d0">drsym_search_symbols_ex()</a> which return drsym_info_t on each symbol</li>
<li>Added <a class="el" href="dr__tools_8h.html#a364db17ca1ba042f4fa3280b49fb2ad6">dr_exit_process()</a> to cleanly shut down with a specified exit code</li>
<li>Added <a class="el" href="dr__tools_8h.html#a153dc4defa904b033e122bb8957b0288">dr_convert_handle_to_pid()</a></li>
<li>Added <a class="el" href="dr__events_8h.html#aa719c9575ca2329c03ab60ef41ba14c6">dr_nudge_client_ex()</a> to enable nudging other processes from within a client</li>
<li>Added <a class="el" href="dr__ir__opnd_8h.html#adccf1dfd3ec95b71a8a0b205cf48da7a">reg_resize_to_opsz()</a></li>
<li>Added <a class="el" href="dr__ir__utils_8h.html#a0cbf1b9557d56d555bbdaae525b0992d">dr_save_arith_flags_to_xax()</a> and <a class="el" href="dr__ir__utils_8h.html#ab69b4cb9ffac510fbfceab08472de13e">dr_restore_arith_flags_from_xax()</a></li>
<li>Added <a class="el" href="dr__tools_8h.html#a67c362b4605972c0d54142c4469e45c6">dr_snwprintf()</a> and <a class="el" href="dr__tools_8h.html#aa89fd0244d2133a1e37b5b6662a41cc6">dr_vsnwprintf()</a></li>
<li>Added <a class="el" href="group__drwrap.html#ga0ae2e383b0005a46848c7d0497be563a">drwrap_replace_native()</a>, <a class="el" href="group__drwrap.html#ga3f23eb9d8bd537881dcea9ecb19b5a4f">drwrap_is_replaced()</a>, <a class="el" href="group__drwrap.html#ga87ab96ab2d3c5cc33480693266b33249">drwrap_is_replaced_native()</a></li>
<li>Added <a class="el" href="dr__ir__utils_8h.html#af09cc56ad45eb3aa0f10ea5a0cb6aadd">dr_clobber_retaddr_after_read()</a></li>
<li>Added <a class="el" href="dr__tools_8h.html#a0cabd36923c3e56efb50bc10ee866918">dr_get_string_option()</a> and <a class="el" href="dr__tools_8h.html#aba205966cb16d0478ecf159cdfeaee8b">dr_get_integer_option()</a> to support querying arbitrary DynamoRIO runtime options</li>
<li>Added support for building with Visual Studio 2010 and with MSBuild</li>
<li>Added <a class="el" href="dr__ir__instr_8h.html#ab5541d2b9311f842c43c0cfca020eb5d">instr_is_near_ubr()</a> and <a class="el" href="dr__ir__instr_8h.html#a87d172e2621d4548fe2c414fb0ed333a">instr_is_near_call_direct()</a></li>
<li>Added exported CMake cross-platform assembly support in cpp2asm_support.cmake and auxiliary files</li>
<li>Added get_DynamoRIO_defines() to DynamoRIOConfig.cmake</li>
<li>Added DR_EMIT_MUST_END_TRACE flag</li>
<li>Improved the performance of <a class="el" href="dr__tools_8h.html#a6a94558696130c76f34dcdac0ce50c47">dr_safe_read()</a> such that it out-performs DR_TRY_EXCEPT and no longer invokes a system call on Windows.</li>
<li>Added <a class="el" href="dr__ir__utils_8h.html#aa101c165975f98f274d0a676136bb32d">dr_redirect_native_target()</a></li>
<li>Added <a class="el" href="dr__tools_8h.html#a28d121869aba7466a553effe8356bf5e">dr_mark_safe_to_suspend()</a></li>
<li>Added <a class="el" href="dr__tools_8h.html#a9accc32bf0c9c784516a7ce5373a3d2b">dr_mutex_mark_as_app()</a>, <a class="el" href="dr__tools_8h.html#ac3e6105ff0e2a3593f5ef296074e21e2">dr_rwlock_mark_as_app()</a>, and <a class="el" href="dr__tools_8h.html#a376d41758da76279edfe5f649382feb7">dr_recurlock_mark_as_app()</a></li>
<li>Added <a class="el" href="dr__tools_8h.html#a21e44337705f8c8a2368427bcb69ca73">dr_get_main_module()</a></li>
<li>Added module import iterators <a class="el" href="dr__tools_8h.html#ab4208bf4fd46868975824d1c865f370e">dr_module_import_iterator_start()</a>, <a class="el" href="dr__tools_8h.html#aa057e58c848b5860617a10014f828f45">dr_module_import_iterator_hasnext()</a> <a class="el" href="dr__tools_8h.html#ae9863e3f8ac53d7b1d1c023e00c6ec4a">dr_module_import_iterator_next()</a>, <a class="el" href="dr__tools_8h.html#a3767d9282831c030307c9d89cd8c081b">dr_module_import_iterator_stop()</a>, <a class="el" href="dr__tools_8h.html#a6e4b0ee00f77ddf42c5094735b1fc615">dr_symbol_import_iterator_start()</a>, <a class="el" href="dr__tools_8h.html#a84b16b985754da06d7c8a864dfed2b44">dr_symbol_import_iterator_hasnext()</a>, <a class="el" href="dr__tools_8h.html#af3b3e34e05cf82fb5b5801389eab835d">dr_symbol_import_iterator_next()</a>, and <a class="el" href="dr__tools_8h.html#a9b57decf95101db3153968868c126e38">dr_symbol_import_iterator_stop()</a>.</li>
<li>Added DR_FAST_IR to allow clients to inline some key IR routines</li>
<li>Added -logdir runtime option for control over the log directory</li>
<li>Added <a class="el" href="group__drmgr.html#ga4f53520da678e84fd7712e2fcca0182b">drmgr_get_parent_cls_field()</a></li>
<li>Added support for building DynamoRIO with Visual Studio 2012 and the Windows 8 WDK</li>
<li>Added a new operand type enabling an <a class="el" href="structinstr__t.html">instr_t</a> to be used as a memory reference: <a class="el" href="dr__ir__opnd_8h.html#ae4a6e3dea7723c44dcacd9e16d47afd0">opnd_create_mem_instr()</a>, <a class="el" href="dr__ir__opnd_8h.html#ae0a71c34e19463d38a3a74f3a1ed5cc1">opnd_is_mem_instr()</a>, <a class="el" href="dr__ir__opnd_8h.html#a1e7ea7b3b96e8d3ccc3c01e777a0ddfb">opnd_get_mem_instr_disp()</a></li>
<li>Added DYNAMORIO_CONFIGDIR alternative to HOME as a config dir location. Additionally, drrun uses a temp dir for config files rather than failing.</li>
<li>Added library search path control via the client_basename.drpath file</li>
<li>Added <a class="el" href="group__drmgr.html#ga5afd374b143bb438d486c60bdf7cbc4e">drmgr_register_pre_syscall_event_ex()</a></li>
<li>Added DR_MEMPROT_GUARD for dr_memory_protect (Windows only).</li>
<li>Added <a class="el" href="dr__tools_8h.html#ae227695587313ae94369e43e459ee762">dr_sscanf()</a></li>
<li>Added notifications on application faults and additional information on client faults</li>
<li>Added conversion between UTF-16 and UTF-8 to <a class="el" href="dr__tools_8h.html#ab0c5f2529d9c076b5b0b0e92a70834b7">dr_snprintf()</a> and <a class="el" href="dr__tools_8h.html#a67c362b4605972c0d54142c4469e45c6">dr_snwprintf()</a></li>
<li>Added simplified -c client argument form to drrun, drconfig, and drinject.</li>
<li>Added official support for the <a class="el" href="using.html#op_speed">-opt_speed</a> option to prioritize speed over a simple code stream.</li>
<li>Added <a class="el" href="dr__tools_8h.html#a669ec1a44523f58c52378020ecd87ccf">dr_atomic_add32_return_sum()</a></li>
<li>Deprecated <a class="el" href="dr__ir__utils_8h.html#a44636ca6809a9fb22cf817701de9ee09">dr_save_arith_flags()</a> and <a class="el" href="dr__ir__utils_8h.html#a563b0de37a51cb2e84337deef30a57cf">dr_restore_arith_flags()</a></li>
<li>Fixed performance regression involving inlined clean calls</li>
<li>Fixed bug involving 32-bit Linux support on a 64-bit Linux kernel on an AVX-enabled processor (Issue 754)</li>
<li>Fixed bug involving multimedia state on a 32-bit Windows kernel (Issue 139)</li>
<li>Fixed bugs building and running on Ubuntu 11.10 (Issue 718, Issue 720)</li>
<li>Several other bug fixes</li>
<li>Added <a class="el" href="dr__tools_8h.html#ad6201fa3676b0afb76f91f15822cf0d1">dr_raw_mem_alloc()</a> and <a class="el" href="dr__tools_8h.html#a17b097679298ae00bab97d77ed4a17c2">dr_raw_mem_free()</a>. However, they are still experimental, are in flux, and are subject to change in the next release.</li>
</ul>
<hr/>
 The changes between version 3.2.0 and 3.1.0 are:</p>
<ul>
<li>Added support for PECOFF + DWARF2 symbols on Windows in the drsyms Extension</li>
<li>Added support for building extensions as static libraries (subject to licensing constraints) via DR_EXT_{DRWRAP,DRUTIL,DRMGR,DRSYMS}_STATIC</li>
<li>Added support for linking C clients with libc via DynamoRIO_USE_LIBC</li>
<li>Added <a class="el" href="dr__ir__utils_8h.html#a8640a5d47dcf82be4e6a5cf77bd6d967">dr_insert_clean_call_ex()</a></li>
<li>Added a no-frills drwrap mode for faster but constrained wrapping</li>
<li>Added <a class="el" href="group__drwrap.html#ga92584c3e1980ac0c467de7d14d2bc2a2">drwrap_get_drcontext()</a> for performance</li>
<li>Added drwrap notification on exceptions bypassing post-hooks</li>
<li>Added <a class="el" href="group__drwrap.html#gaff6f66f7ec021cea150eb753f5db2b75">drwrap_wrap_ex()</a> to pass initial constant user data</li>
<li>Added <a class="el" href="group__drwrap.html#ga01e56e9bac8f584fe25e806a24769d50">drwrap_is_wrapped()</a> and <a class="el" href="group__drwrap.html#ga16fc2d260f5ebead724d5eb98bf13ac2">drwrap_is_post_wrap()</a></li>
<li>Added <a class="el" href="group__drwrap.html#gae2cc2affaf879182ba4d92299704c65f">drwrap_set_global_flags()</a> to control safety of application memory accesses</li>
<li>Added <a class="el" href="group__drwrap.html#gac3a79cf043d8c21dc190721d9fb105de">drwrap_get_mcontext_ex()</a> to avoid the cost of copying multimedia register values when not necessary</li>
<li>Added drwrap interface for caching post-call addresses</li>
<li>Added <a class="el" href="group__drmgr.html#ga357735ce7daa0bb717556455f20040a5">drmgr_decode_sysnum_from_wrapper()</a></li>
<li>Added <a class="el" href="group__drutil.html#gab75e6f41cd4ee5afaec592725abe1557">drutil_expand_rep_string_ex()</a> that returns additional information about string loop expansion</li>
<li>Added improved instrlist disassembly that includes labels and instruction targets</li>
<li>Added <a class="el" href="dr__ir__instr_8h.html#a25107e1fb5a49de3c627b70acc7b2eef">instr_compute_address_ex_pos()</a> for instrs with multiple memory operands.</li>
<li>Added <a class="el" href="dr__tools_8h.html#aae96ea91548daf1a0b5a78197bc86f07">dr_get_client_base()</a></li>
<li>Added <a class="el" href="dr__tools_8h.html#ad6b928d8cbc48fdf7d1d82c4fa95e40e">dr_vsnprintf()</a></li>
<li>Added service pack version to <a class="el" href="dr__tools_8h.html#abab30ef95ab36e4e885a9dc89f540c39">dr_get_os_version()</a></li>
<li>Added mediation of note fields to drmgr</li>
<li>Added custom storage in label instructions via <a class="el" href="dr__ir__instr_8h.html#a7eab5eaa85e186349d200a87e8010fec">instr_get_label_data_area()</a></li>
<li>Added support for multiple non-meta control transfer instructions with intra-block targets in one basic block to drmgr</li>
<li>Added user data passing support among all four passes of drmgr</li>
<li>Several bug fixes</li>
</ul>
<hr/>
 Version 3.0.0 was a development version. 3.1.0 is the first official released version of the 3.x series.</p>
<p>The changes between version 3.0.0 and 2.2.0 include the following major features:</p>
<ul>
<li>Added a private loader on Linux for better support for C++ clients and third-party library usage by clients</li>
<li>Added Linux support for <code>drsyms</code> to enable symbol processing in Linux clients</li>
<li>Added <code>drutil</code> Extension which provides memory address retrieval and string loop expansion (note: LGPL license)</li>
<li>Added a static library for decoding and encoding</li>
</ul>
<p><b>IMPORTANT:</b> The 3.0.0 and onward client API is mostly backward compatible with releases from 1.0.0 (originally called 0.9.6: see below) onward with the exception of functions that involve dr_mcontext_t and several other source and binary compatibility changes since version 2.2.0 described below. The dr_mcontext_t struct and all structs that contain it have changed and are NOT backward compatible with releases prior to 3.0.0.</p>
<p>A sample script for updating client sources to the 3.0.0 API's version of dr_mcontext_t and related functions is as follows:</p>
<div class="fragment"><div class="line">perl -pi -e <span class="stringliteral">&#39;\</span></div>
<div class="line"><span class="stringliteral">s|dr_mcontext_t (\w+);|dr_mcontext_t \1 = {sizeof(\1),DR_MC_ALL,};|;\</span></div>
<div class="line"><span class="stringliteral">s|(dr_[gs]et_mcontext\(\S+,\s+\S+),\s+[^\s\)]+\)|\1)|;\</span></div>
<div class="line"><span class="stringliteral">s|(dr_redirect_execution\(\S+),\s+\S+\)|\1)|;\</span></div>
<div class="line"><span class="stringliteral">s|^\s+int app_errno;\s*\n||ms;\</span></div>
<div class="line"><span class="stringliteral">s|raw_mcontext\.|raw_mcontext-&gt;|g;\</span></div>
<div class="line"><span class="stringliteral">s|info-&gt;mcontext\.|info-&gt;mcontext-&gt;|g;\</span></div>
<div class="line"><span class="stringliteral">s|excpt-&gt;mcontext\.|excpt-&gt;mcontext-&gt;|g;&#39;</span> *.c</div>
</div><!-- fragment --><p>The script makes 3 main changes. First, any dr_mcontext_t allocated by the client must have its <code>size</code> and <code>flags</code> fields set. Second, the <code>app_errno</code> parameter was removed from several functions; it required a local variable, so any local named <code>app_errno</code> is removed. Third, the dr_mcontext_t fields in the fault, signal, and exception structs all became pointers.</p>
<p>This script may not catch all cases. Use your version control system to look at the diff after applying it to ensure it did not change anything it shouldn't have. Run with debug build to catch other instances where <a class="el" href="struct__dr__mcontext__t.html#a11c0a7fef86b59511a30b31718e3d5e1">dr_mcontext_t.size</a> is not set. Also note that using the dr_mcontext_t initialization syntax in the script will end up calling memset; for performance-critical situations, instead initialize only the size and flags fields separately. Also note that if the xmm or ymm registers are not needed, asking for DR_MC_CONTROL and/or DR_MC_INTEGER is more performant than DR_MC_ALL.</p>
<p><b>IMPORTANT:</b> Further changes between version 3.0.0 and 2.2.0 include the following that affect source and/or binary compatibilty:</p>
<ul>
<li>Changed the <a class="el" href="dr__defines_8h.html#a5d50a4225e834d67f66438669608e435">dr_mcontext_t</a> structure field layout. This is a binary compatibility change with respect to versions prior to 3.0.0.</li>
<li>Added a <a class="el" href="struct__dr__mcontext__t.html#a11c0a7fef86b59511a30b31718e3d5e1">dr_mcontext_t.size</a> field which must be set by the client prior to calling <a class="el" href="dr__ir__utils_8h.html#a91ffde2808c16e07f323c34affa72209">dr_get_mcontext()</a>, <a class="el" href="dr__ir__utils_8h.html#a56568d24667f5d64264d0bad398727b3">dr_set_mcontext()</a>, or dr_redirect_execution. This is a source compatibility change with respect to versions prior to 3.0.0.</li>
<li>Added a <a class="el" href="struct__dr__mcontext__t.html#a3aa9824f7e23cec6552859cc29af4b68">dr_mcontext_t.flags</a> field which must be set by the client prior to calling <a class="el" href="dr__ir__utils_8h.html#a91ffde2808c16e07f323c34affa72209">dr_get_mcontext()</a>, <a class="el" href="dr__ir__utils_8h.html#a56568d24667f5d64264d0bad398727b3">dr_set_mcontext()</a>, or dr_redirect_execution. This is a source compatibility change with respect to versions prior to 3.0.0.</li>
<li>Removed the app_errno parameter from <a class="el" href="dr__ir__utils_8h.html#a91ffde2808c16e07f323c34affa72209">dr_get_mcontext()</a>, <a class="el" href="dr__ir__utils_8h.html#a56568d24667f5d64264d0bad398727b3">dr_set_mcontext()</a>, and <a class="el" href="dr__ir__utils_8h.html#a9f612cf9d0ca2025b23d30b6f5bb0231">dr_redirect_execution()</a>. This is a source compatibility change with respect to versions prior to 3.0.0.</li>
<li>Changed all dr_mcontext_t fields in the dr_restore_state_info_t, dr_exception_t, and dr_siginfo_t structs to be pointers. This is a source compatibility change with respect to versions prior to 3.0.0.</li>
<li>Changed the bool typedef from int to char for C++ compatibility. This is a binary compatibility change with respect to versions prior to 3.0.0.</li>
<li>Changed the signature of <a class="el" href="group__drwrap.html#ga27894370f3da794ff3f31cb8d7ec079b">drwrap_unwrap()</a>, in order to allow one of the pre or post hooks to be optional (Issue 562). This is a source compatibility change with respect to versions prior to 3.0.0.</li>
<li>Moved console printing support from the drsyms Extension to core DR. The drsym_write_to_console() and drsym_using_console() are no longer supported. Instead, call <a class="el" href="dr__tools_8h.html#a712de67b3f6adb6778ce302925009753">dr_enable_console_printing()</a> in <a class="el" href="dr__api_8h.html#a20a4dc9da7f6bb9121e30bb3570c6961">dr_init()</a>, which then enables <a class="el" href="dr__tools_8h.html#abad2eddb3786e3e909ff36da39b7e31e">dr_printf()</a> and <a class="el" href="dr__tools_8h.html#a1affb1a9f1c49c1959f1a01967a0a0d9">dr_fprintf()</a> to print to the console (with some limitations: see <a class="el" href="dr__tools_8h.html#a712de67b3f6adb6778ce302925009753">dr_enable_console_printing()</a> documentation). This is a source compatibility change with respect to versions prior to 3.0.0.</li>
<li>Added a <code>flags</code> argument to most of the routines in the <code>drsyms</code> extension to control demangling, and added <a class="el" href="group__drsyms.html#gad582a65dc1308335633e0c451035dbe0">drsym_demangle_symbol()</a>. This is a source compatibility change with respect to versions prior to 3.0.0.</li>
<li>Added <a class="el" href="group__drsyms.html#ga8b7f688e703f8ca1937f091f53d3d697">drsym_get_module_debug_kind()</a> and a <code>debug_kind</code> field to the <code>drsym_info_t</code> struct written by <a class="el" href="group__drsyms.html#ga201e8a9bf6746cbfd232bc4e4a243d2b">drsym_lookup_address()</a>. These additions allow drsyms users to determine what kind of debug info is available for a module. The <code>debug_kind</code> field creates a binary compatibility change for users of <code>drsym_info_t</code> with respect to versions prior to 3.0.0.</li>
</ul>
<p>Additional changes between version 3.0.0 and 2.2.0 include the following:</p>
<ul>
<li>Added <code>drvector</code> to drcontainers Extension: simple resizable vector</li>
<li>Added a windbg script for auto-locating libraries for easier debugging</li>
<li>Added <a class="el" href="dr__tools_8h.html#ae453a9c1ded7c8cd31d1a1aa2c8810af">dr_mutex_self_owns()</a> and recursive lock support (dr_recurlock_*) (Issue 219)</li>
<li>Added <a class="el" href="dr__tools_8h.html#af7d3a723c65e3762dd62b115577e0625">dr_map_file()</a>, <a class="el" href="dr__tools_8h.html#ae7f36900cafd048db5b8d34cf92faa45">dr_unmap_file()</a>, and <a class="el" href="dr__tools_8h.html#a06a8173579db03d018935afb1ca891f6">dr_file_size()</a> (Issue 542)</li>
<li>Added <a class="el" href="dr__tools_8h.html#ab23dff0c2d6d045cd938fc5f2c77a1ff">dr_rename_file()</a> and <a class="el" href="dr__tools_8h.html#a7ce7b5b2390cb5e03466cd605735bdfc">dr_delete_file()</a>.</li>
<li>Added routines to disassemble to a buffer rather than a file (Issue 524)</li>
<li>Added support for the AVX and FMA ISA extensions</li>
<li>Added <a class="el" href="dr__proc_8h.html#abf85cc821aab9850b8333eb32b953ca9">dr_insert_get_seg_base()</a></li>
<li>Added return value to <a class="el" href="dr__ir__utils_8h.html#a9f612cf9d0ca2025b23d30b6f5bb0231">dr_redirect_execution()</a> and <a class="el" href="dr__ir__utils_8h.html#a56568d24667f5d64264d0bad398727b3">dr_set_mcontext()</a></li>
<li>Increased maximum option string from 512 to 2048 (Issue 363)</li>
<li>Increased default stack size from 20KB to 56KB to make it easier to use C++ and external libraries with larger stack usage</li>
<li>Added <a class="el" href="dr__tools_8h.html#abab30ef95ab36e4e885a9dc89f540c39">dr_get_os_version()</a> (Issue 304)</li>
<li>Deprecated the "meta-instruction that can fault" property and <a class="el" href="dr__ir__instr_8h.html#a954715b40fa2668d7cde0c4a1bf47e51">instr_is_meta_may_fault()</a>, <a class="el" href="dr__ir__instr_8h.html#a94227a193446d370f0180e6a844be0c2">instr_set_meta_may_fault()</a>, <a class="el" href="dr__ir__utils_8h.html#affe811040a2962e5c6920a3c523212ab">instrlist_meta_fault_preinsert()</a>, <a class="el" href="dr__ir__utils_8h.html#a6ea095671bab4239c659d17d4a9cda56">instrlist_meta_fault_postinsert()</a>, and <a class="el" href="dr__ir__utils_8h.html#a94a1526c7b520c9aefbd775adfc57108">instrlist_meta_fault_append()</a>.</li>
<li>Added <a class="el" href="dr__tools_8h.html#a7ed94a2b046bb9ee777afe4f3ef1237f">dr_using_app_state()</a></li>
<li>Added <a class="el" href="dr__ir__instr_8h.html#a5356c2dd3388496158fa0a918f8c2a53">instr_encode_to_copy()</a> and <a class="el" href="dr__ir__instrlist_8h.html#a8ae48a113e137b95cd3499f9fa57f5ea">instrlist_encode_to_copy()</a></li>
<li>Added <a class="el" href="dr__ir__utils_8h.html#a3082c5db55039c72ae30e3276f622aae">disassemble_set_syntax()</a> for -syntax_intel control without runtime options and <a class="el" href="dr__proc_8h.html#a5a9d6c28ef304d6b4f5e1a45fb9da996">proc_set_vendor()</a> to control vendor-specific ISA details when decoding or encoding</li>
<li>Added <a class="el" href="dr__ir__instrlist_8h.html#a24c81467322f6eb86a8652ab1000fd2a">instrlist_set_fall_through_target()</a> and <a class="el" href="dr__ir__instrlist_8h.html#a71b0819b01546ec1b69063ba189a613e">instrlist_set_return_target()</a></li>
<li>Added <a class="el" href="group__drcontainers.html#ga2bcb10d265f6005bbcef89129ad58548">hashtable_clear()</a> to the drcontainers Extension</li>
<li>Several bug fixes</li>
</ul>
<hr/>
 The changes between version 2.2.0 and 2.1.0 are:</p>
<ul>
<li>Added <code>drwrap</code> Extension which provides function wrapping and replacing (note: LGPL license)</li>
<li>Added <code>drmgr</code> Extension: the DynamoRIO Multi-Instrumentation Manager Extension, a mediator for combining and coordinating multiple instrumentation passes</li>
<li>Added read-write locks (Issue 406)</li>
<li>Added isolation of client-opened files from the application (Issue 357)</li>
<li>Added <a class="el" href="struct__dr__mcontext__t.html#a740db0ec027db5080dc406c5e7127f01">dr_mcontext_t.xip</a> for syscall events (Issue 442)</li>
<li>Several bug fixes</li>
</ul>
<hr/>
 The changes between version 2.1.0 and 2.0.0 are:</p>
<ul>
<li>Added Windows 7 support</li>
<li>Added clean call sequence optimization and auto-inlining.</li>
<li>Added Windows child process following support for clients: -follow_children is now on by default for both Windows and Linux.</li>
<li>Added <a class="el" href="dr__tools_8h.html#adb9ba447c606e5e58400ac7b6ef719d1">DR_TRY_EXCEPT()</a> (Issue 51)</li>
<li>Added dynamic client auxiliary library loading support via <a class="el" href="dr__tools_8h.html#a94c8a2e52880f44d43402d6b0d686db2">dr_load_aux_library()</a>, <a class="el" href="dr__tools_8h.html#a814a1a50cc288dc902f2a2dcef9812c6">dr_lookup_aux_library_routine()</a>, and <a class="el" href="dr__tools_8h.html#a552563b1ccb84e3708041b276404d577">dr_unload_aux_library()</a></li>
<li>Added <a class="el" href="dr__tools_8h.html#aa2944aa54d591a236f5334a35bfb41bf">dr_switch_to_app_state()</a> and <a class="el" href="dr__tools_8h.html#a97ba972c50a47e7121c98652b461ae8e">dr_switch_to_dr_state()</a></li>
<li>Added <a class="el" href="dr__tools_8h.html#af57b95b87d8da29a16ca923a5b1b98b3">dr_client_thread_set_suspendable()</a></li>
<li>Added <a class="el" href="dr__tools_8h.html#aeb3d12bdde33dd279f09bcb2a5bfd901">dr_get_random_value()</a>, <a class="el" href="dr__tools_8h.html#a53bfa41e85c457ff39452a68eaf2281b">dr_set_random_seed()</a>, and <a class="el" href="dr__tools_8h.html#af3212441c8fd1642d6d1fb7850562106">dr_get_random_seed()</a></li>
<li>Added <a class="el" href="dr__tools_8h.html#af471633d0954d80c09ca6c2bfe40475b">dr_file_exists()</a> and <a class="el" href="dr__tools_8h.html#a02f86a68a105442a029baa05a1af9d57">dr_directory_exists()</a> for Linux</li>
<li>Added support for <a class="el" href="dr__ir__utils_8h.html#a91ffde2808c16e07f323c34affa72209">dr_get_mcontext()</a> from secondary thread init events, and changed its return type to bool</li>
<li>Added dynamic hashtable resizing to the drcontainers hashtable</li>
<li>Added <a class="el" href="dr__tools_8h.html#ac150776be7e338321cbb8edc49ab7790">dr_app_pc_from_cache_pc()</a></li>
<li>Added a segment list to module_data_t for Linux and internal support for non-contiguously-mapped modules (Issue 160)</li>
<li>Added PEB isolation (Issue 249) and <a class="el" href="dr__tools_8h.html#a81037ee313844d4fbce3368f4421e5b4">dr_get_app_PEB()</a></li>
<li>Added <a class="el" href="group__drsyms.html#ga260c78496165b54b9a97d0a5e1f6f4d8">drsym_enumerate_symbols()</a> to the <code>drsyms</code> Extension</li>
<li>Added limited support for printing to the cmd window (Issue 261) via the <code>drsyms</code> Extension: drsym_write_to_console() and drsym_using_console()</li>
<li>Renamed the REG_ constants to DR_REG_ to avoid conflicts with system headers (Issue 34). Clients should set(DynamoRIO_REG_COMPATIBILITY ON) prior to configure_DynamoRIO_client() to use the old constants and avoid any source changes; this will happen automatically if the client targets version 2.0 or earlier. Binary compatibility is unaffected.</li>
<li>Deprecated <a class="el" href="dr__tools_8h.html#a902bfca468a7a2cc3dbc45b4bd127444">dr_request_synchronized_exit()</a> and replaced it with <a class="el" href="dr__events_8h.html#acede43748af42c6334a19fc30e48c5f4">dr_set_process_exit_behavior()</a>. Now a full thread synch is performed at exit time in release build if a process exit event or thread exit event is registered. <a class="el" href="dr__events_8h.html#acede43748af42c6334a19fc30e48c5f4">dr_set_process_exit_behavior()</a> can provide more performant exit performance for clients that have flexible exit event requirements.</li>
<li>Switched debug build to also be an INTERNAL=ON build</li>
<li>Fixed bug in handling single-byte-bb selfmod code</li>
<li>Fixed bugs in handling alarm signals</li>
<li>Fixed 64-bit Windows stack alignment bug (Issue 331)</li>
<li>Fixed handling of "data32 rex.w call"</li>
<li>Fixed Issue 320: a problem with thread-private cache resizing</li>
<li>Fixed Issue 319: decode movlhps and movhlps properly</li>
<li>Fixed Issue 139: add xmm0-7 preservation for 32-bit Linux applications, which may have noticeable impacts on clients calling clean calls: e.g., pushing bbs over the max size limit or having a noticeable performance hit.</li>
<li>Support building sources using Visual Studio</li>
</ul>
<hr/>
 In version 2.0.0, the configuration and deployment API and tools changed and are not backward compatible with earlier versions: see below for details. The changes between version 2.0.0 and 1.5.0 are:</p>
<ul>
<li>Changed the configuration and deployment model for both Linux and Windows to use a configuration file based approach on both platforms, which adds control over child processes on Linux and supports local configuration on Windows for un-privileged and parallel execution (Issue 265). The registry is no longer used for individual application configuration on Windows other than to point at the location for global configuration files, when used.<br/>
 <b>IMPORTANT:</b> On Windows the following non-backward-compatible changes have been made:<ul>
<li>drdeploy.exe no longer exists (replaced by drconfig.exe and drrun.exe)</li>
<li>drconfig.dll is now drconfiglib.dll</li>
<li>drconfiglib.dll's API routines now take in a process id to support one-time targeted-process configuration (to support parallel execution)</li>
<li>configuration is either per-user or global, with per-user taking precedence when both exist</li>
<li>configuration does NOT enable systemwide injection by default: use the -syswide_on parameter to drconfig or drrun for that (it requires administrative privileges)</li>
</ul>
<b>IMPORTANT:</b> On Linux, if you're using custom injection via raw environment variables rather than using the <code>drdeploy</code> script, you must also set DYNAMORIO_RUNUNDER to 1 for injection to work with this release.</li>
<li>Added drinjectlib.dll and <a class="el" href="dr__inject_8h.html" title="Injection API. Use these functions to launch processes under the control of DynamoRIO.">dr_inject.h</a>, making custom injection tools easier to build (Issue 246)</li>
<li>Added DynamoRIO Extension support for auxiliary libraries that extend the DynamoRIO API (Issue 277)</li>
<li>Added symbol lookup support via Extension (Windows only for now) (Issue 44)</li>
<li>Added a "drcontainers" Extension that initially contains a hashtable</li>
<li>Added thread creation support: <a class="el" href="dr__tools_8h.html#ac6b80b83502ff13d4674b13e7b30b555">dr_create_client_thread()</a> (Issue 41)</li>
<li>Added <a class="el" href="dr__tools_8h.html#af154e498d8b185931ef970676cb65351">dr_sleep()</a></li>
<li>Added <a class="el" href="dr__tools_8h.html#a9191c67a267070ed51289d7192f986aa">dr_set_itimer()</a> and <a class="el" href="dr__tools_8h.html#ab5cd85ea911bd99dedbd8d05796260bc">dr_get_itimer()</a> (Linux-only) (Issue 283)</li>
<li>Added <a class="el" href="dr__tools_8h.html#acd67a10cd03a382853a0523bde9990f5">dr_app_pc_for_decoding()</a></li>
<li>Added -synch_at_exit option and <a class="el" href="dr__tools_8h.html#a902bfca468a7a2cc3dbc45b4bd127444">dr_request_synchronized_exit()</a> to provide guarantees over thread exit event timing in release build</li>
<li>Added <a class="el" href="dr__ir__instr_8h.html#a238dc0a1168701e30a95b57dd0c845a0">instr_cmovcc_triggered()</a> and <a class="el" href="dr__ir__instr_8h.html#a222195624605490e7844ed3737ad3668">instr_cmovcc_to_jcc()</a></li>
<li>Renamed OP_fcmovene to OP_fcmovne</li>
<li>Implemented <a class="el" href="dr__ir__instr_8h.html#acc25aa34b90fcf0cdcfdbd8028464274">instr_invert_cbr()</a> for OP_jcc_short</li>
<li>Added the full path to modules in module_data_t</li>
<li>Added <a class="el" href="dr__tools_8h.html#af1a068ad89408abbcfba026706810211">dr_get_proc_address_ex()</a> to support indirect code objects</li>
<li>Added <a class="el" href="dr__tools_8h.html#a4b187636a3fc9ba7964ae11a7fd30fb6">dr_get_milliseconds()</a> and <a class="el" href="dr__tools_8h.html#ae517c4817d67af6ad92b8f1d7694080a">dr_get_time()</a> impl for Linux</li>
<li>Added <a class="el" href="dr__ir__instr_8h.html#a465cc4935f184c4d224afbb9547a445c">instr_is_undefined()</a></li>
</ul>
<hr/>
 The changes between version 1.5.0 and 1.4.0 are:</p>
<ul>
<li>Added a private loader on Windows for better support for library usage by clients</li>
<li>Added nudge support on Linux</li>
<li>Added <a class="el" href="dr__tools_8h.html#a01fbe357fcc8352ba63c9a1a23e0c207">dr_suspend_all_other_threads()</a> and <a class="el" href="dr__tools_8h.html#a1193842150b09442a1b3c91f4e02d280">dr_resume_all_other_threads()</a></li>
<li>Made it easier for clients to use faults to push rare events out of instrumentation paths:<ul>
<li>Added access to the pre-translated context and the code fragment information for both <a class="el" href="dr__events_8h.html#a3ac512c0bd9feea08cb04dd923efb589">dr_register_signal_event()</a> and <a class="el" href="dr__events_8h.html#a69adae9409a1871149da69e97747b84c">dr_register_exception_event()</a> This changed the return type for exception event callbacks.</li>
<li>Added a signal/exception event on a fault in non-code-cache DynamoRIO code, such as client-generated code.</li>
<li>Added the "meta-instruction that can fault" property via <a class="el" href="dr__ir__instr_8h.html#a954715b40fa2668d7cde0c4a1bf47e51">instr_is_meta_may_fault()</a>, <a class="el" href="dr__ir__instr_8h.html#a94227a193446d370f0180e6a844be0c2">instr_set_meta_may_fault()</a>, <a class="el" href="dr__ir__utils_8h.html#affe811040a2962e5c6920a3c523212ab">instrlist_meta_fault_preinsert()</a>, <a class="el" href="dr__ir__utils_8h.html#a6ea095671bab4239c659d17d4a9cda56">instrlist_meta_fault_postinsert()</a>, and <a class="el" href="dr__ir__utils_8h.html#a94a1526c7b520c9aefbd775adfc57108">instrlist_meta_fault_append()</a>.</li>
<li>Added a new event <a class="el" href="dr__events_8h.html#a000e59a3f500a2d4a1d0123ce6032f77">dr_register_restore_state_ex_event()</a> that provides the pre-translated context and code fragment information, and allows for translation failure for non-fault translations.</li>
</ul>
</li>
<li>Added <a class="el" href="dr__tools_8h.html#a66ef4b43d78d787c7622569d30717051">dr_dup_file_handle()</a></li>
<li>Added <a class="el" href="dr__tools_8h.html#a813f98fcc06c0a1198262b744e98eced">dr_memory_is_dr_internal()</a> and <a class="el" href="dr__tools_8h.html#a2a67b03d64626f3d0a78b64bf096ed25">dr_memory_is_in_client()</a></li>
<li>Added <a class="el" href="dr__tools_8h.html#a11575b203a0558f5df50126ff04c4598">dr_get_parent_id()</a></li>
<li>Added <a class="el" href="dr__ir__utils_8h.html#a3952e7614f4bf8e62f360f08683ad8a0">decode_opcode_name()</a></li>
<li>Removed the deprecated snprintf() as it causes symbol pre-emption problems on Linux. Older clients should switch to <a class="el" href="dr__tools_8h.html#ab0c5f2529d9c076b5b0b0e92a70834b7">dr_snprintf()</a>.</li>
<li>Fixed bug in cross-architecture execve (Issue 146)</li>
<li>Clone record is now passed via dstack instead of ebp (Issue 149)</li>
<li>Fixed close() syscall handling, !HAVE_TLS assert &amp; minor issues (Issue 151)</li>
</ul>
<hr/>
 The changes between version 1.4.0 and 1.3.2 are:</p>
<ul>
<li>Added directly-addressable thread-local storage slots for exclusive client use:<ul>
<li><a class="el" href="dr__tools_8h.html#a95b53d79cae021a473c39f3b2662323f">dr_raw_tls_calloc()</a></li>
<li><a class="el" href="dr__tools_8h.html#afc53219d019078a38c80ffa80d71829e">dr_raw_tls_cfree()</a></li>
</ul>
</li>
<li>Provide 64-bit versions of the drdeploy.exe and drview.exe tools</li>
<li>Provide <a class="el" href="dr__tools_8h.html#a8da7923ecc4e020e31442bcc8d9f8d3e">dr_get_proc_address()</a> on Linux</li>
<li>Added <a class="el" href="dr__tools_8h.html#a5a6e4049f8accbc73ec5dbaf0deb25a7">dr_query_memory_ex()</a> to allow address space walking on Linux</li>
<li>Added -msgbox_mask on Linux: waits for a keypress<ul>
<li>Added STDIN and <a class="el" href="dr__tools_8h.html#aed162d7ad949b05fe8232771eaeca6a9">dr_get_stdin_file()</a></li>
</ul>
</li>
<li>Added shared library versioning on Linux</li>
<li>Support calling <a class="el" href="dr__ir__utils_8h.html#a91ffde2808c16e07f323c34affa72209">dr_get_mcontext()</a> from bb and trace callbacks</li>
<li>Provide support for building clients using CMake (see cmake/, and for an example of usage see samples/CMakeLists.txt)</li>
<li>Provide support for clients to use -fvisibility by setting the define USE_VISIBILITY_ATTRIBUTES for <a class="el" href="dr__defines_8h.html" title="Basic defines and type definitions.">dr_defines.h</a></li>
<li>Added <a class="el" href="dr__ir__instr_8h.html#aa04322a189dd7f17ab245594e02cc6a8">instr_compute_address_ex()</a> for instrs with multiple memory operands</li>
<li>Provide <a class="el" href="dr__tools_8h.html#ab0c5f2529d9c076b5b0b0e92a70834b7">dr_snprintf()</a> (identical to snprintf()) for consistent naming and to avoid gcc warnings about using pointers with x (which we're using because there is no portable way to precisely control p)</li>
<li>The statistics viewer <code>DRgui.exe</code> is no longer supported on Windows NT. Statistics still work, but the graphical application itself will not run on NT.</li>
<li>Changed the top-level registry key to "DynamoRIO"</li>
<li>Re-arranged layout of bin and samples directories</li>
<li>Symbols for all binaries are now included</li>
</ul>
<hr/>
 The changes between version 1.3.2 and 1.3.1 are:</p>
<ul>
<li>Added support for Linux execve of cross-architectural executables (e.g., 32-bit process performing execve of 64-bit executable)<ul>
<li>Also, libdrpreload.so is now kept in the same libXX/{debug,release} directory as libdynamorio.so</li>
</ul>
</li>
<li><a class="el" href="dr__ir__instr_8h.html#a33a349e086f96bb03bd6700129dc6135">instr_convert_short_meta_jmp_to_long()</a> now returns the longer version of the taken jump, to use when setting the target of a jecxz or loop* branch.</li>
<li>Various bug fixes including in these areas:<ul>
<li><a class="el" href="dr__tools_8h.html#a601cd2b724ac627aef0756a4c4eee637">dr_syscall_set_result()</a> and <a class="el" href="dr__tools_8h.html#a76797a9310bf67ebeb820d80e11764b8">dr_syscall_invoke_another()</a></li>
<li>64-bit drinject stack alignment</li>
<li>64-bit erroneous assert in <a class="el" href="dr__tools_8h.html#a83b3658ca78e6b7adc81c57691f0fe50">dr_get_process_id()</a></li>
<li>64-bit dr_file_{tell,seek} worked but returned failure</li>
<li>-opt_memory bugs resulting in asserts</li>
<li>sigprocmask() corner case bug</li>
<li>signal handler sharing for NPTL threads</li>
<li>decoding across page boundaries on Linux</li>
</ul>
</li>
</ul>
<hr/>
 Version 1.3.1 is identical to 1.3.0 but is under a BSD license (see <a class="el" href="page_license.html">Licenses</a>).</p>
<p>We re-numbered the previous DynamoRIO versions as follows:</p>
<ul>
<li>1.0.0 = 0.9.6 build 9600</li>
<li>1.1.0 = 0.9.6 build 9601</li>
<li>1.2.0 = 0.9.6 build 9602</li>
</ul>
<hr/>
 The changes between version 1.3.0 and version 1.2.0 (0.9.6 9602) are:</p>
<ul>
<li>Version numbering shift to 1.x.y instead of 0.9.6 960x</li>
<li>New system call pre, post, and filter events, and new system call parameter and result access, along with a feature to chain system calls:<ul>
<li><a class="el" href="dr__events_8h.html#aa37d61a7f9dde4663b8dd4c3a44732f4">dr_register_pre_syscall_event()</a></li>
<li><a class="el" href="dr__events_8h.html#a099441f8d147404355c66178e3b19f0f">dr_register_post_syscall_event()</a></li>
<li><a class="el" href="dr__events_8h.html#a7ec572232450344efcba8923cae71d51">dr_register_filter_syscall_event()</a></li>
<li><a class="el" href="dr__tools_8h.html#a1e01fe123ecc9908ada9c9fccbf3f6ab">dr_syscall_get_param()</a></li>
<li><a class="el" href="dr__tools_8h.html#ac21a83f1812443112303ef3ea8b76de2">dr_syscall_set_param()</a></li>
<li><a class="el" href="dr__tools_8h.html#abc80dfdf8bff3c3feb486aacd69aba7c">dr_syscall_set_sysnum()</a></li>
<li><a class="el" href="dr__tools_8h.html#ad12463724bf63a891e991891c72e6a4b">dr_syscall_get_result()</a></li>
<li><a class="el" href="dr__tools_8h.html#a601cd2b724ac627aef0756a4c4eee637">dr_syscall_set_result()</a></li>
<li><a class="el" href="dr__tools_8h.html#a76797a9310bf67ebeb820d80e11764b8">dr_syscall_invoke_another()</a></li>
<li><a class="el" href="dr__tools_8h.html#ac5804006579a63b49827169d3ffbebc8">dr_is_wow64()</a></li>
</ul>
</li>
<li>New signal event for Linux<ul>
<li><a class="el" href="dr__events_8h.html#a3ac512c0bd9feea08cb04dd923efb589">dr_register_signal_event()</a></li>
</ul>
</li>
<li>New option <a class="el" href="using.html#op_pause">-pause_on_error</a>, and error messages to stdout by default for release builds, to improve Linux debugging</li>
<li>New routines for memory allocation and memory manipulation:<ul>
<li><a class="el" href="dr__tools_8h.html#ac32b5be072876c25a832d510efeba6e4">dr_nonheap_alloc()</a></li>
<li><a class="el" href="dr__tools_8h.html#a401b819525f805d04e0a9560fdcfdf89">dr_nonheap_free()</a></li>
<li><a class="el" href="dr__tools_8h.html#a2c3a19a0dc146c1e5b6747e89bacfb55">dr_memory_protect()</a></li>
</ul>
</li>
<li>New option <a class="el" href="using.html#op_syntax_intel">-syntax_intel</a> for Intel-style disassembly</li>
<li>New option <a class="el" href="using.html#op_sysenter">-sysenter_is_int80</a></li>
<li>The parameter to an application's system call (normally kept in the eax register) can now be freely changed in basic blocks on all platforms</li>
<li>Added support for 64-bit -thread_private</li>
<li>Added corner-case undocumented IA-32 opcode support</li>
<li>Fixed bug running multi-threaded 64-bit Linux apps</li>
<li>Fixed bugs in 64-bit Linux signal handling</li>
<li>Fixed bug running -thread_private debug build</li>
<li>Fixed bug running 32-bit apps on 64-bit Linux on AMD processors</li>
<li>Fixed bug where OS_OPEN_APPEND overwrote instead of appending on Windows</li>
</ul>
<hr/>
 The changes between the 0.9.6 release builds 9602 and 9601 are:</p>
<ul>
<li>Performance improvements for both the base DynamoRIO system and for client instrumentation when running on Pentium M, Core, and Core 2 processors.</li>
<li>64-bit bug fixes</li>
<li>Added several convenience routines:<ul>
<li><a class="el" href="dr__ir__opnd_8h.html#a4b412ff3d08026f65ac44e1c6659a58a">get_register_name()</a></li>
<li><a class="el" href="dr__ir__opnd_8h.html#a9e132ba3dc1bad4b32a5c61e58ef010f">reg_to_pointer_sized()</a></li>
<li><a class="el" href="dr__ir__opnd_8h.html#a4780b2b04fe82ec06dc481d48cbbf6e5">reg_is_gpr()</a></li>
<li><a class="el" href="dr__ir__opnd_8h.html#a2a1c2869e0ff18940bfdbbd9e8771fb4">reg_is_segment()</a></li>
<li><a class="el" href="dr__ir__opnd_8h.html#a7a4d6e463a49f281c72eee9a61d48613">reg_32_to_8()</a></li>
</ul>
</li>
<li>Disassembly now expands immed sizes to match operands</li>
<li>Fixed bug in <a class="el" href="dr__ir__instr_8h.html#acb2c91a7868ad6a8e5c47af985edde61">instr_is_nop()</a></li>
</ul>
<hr/>
 The changes between the 0.9.6 release builds 9601 and 9600 are:</p>
<ul>
<li>The Windows registry key used is now "VMware, Inc." instead of "VMware"</li>
<li>Added large file support (see <a class="el" href="dr__tools_8h.html#a77a3b276c8d9a62bf6d78c3707d4effd">DR_FILE_ALLOW_LARGE</a>)</li>
<li>Added support for decoding from a copy of code: <a class="el" href="dr__ir__utils_8h.html#aad81737da9662a4e6bf697757cb25ddf">decode_from_copy()</a> and <a class="el" href="dr__ir__utils_8h.html#a2e6a5d44647c481f50ee5208281617ba">disassemble_from_copy()</a>.</li>
<li>Changed the default options to favor performance, and added the <a class="el" href="using.html#op_memory">-opt_memory</a> runtime option to prioritize memory instead.</li>
</ul>
<p>Release 0.9.6 is <b>not</b> backward compatible with prior releases 0.9.1-0.9.5.</p>
<p>The major changes between the 0.9.6 and 0.9.5 releases include 64-bit support, multiple clients, state translation, trace contents, and Linux module events and fast system calls:</p>
<ul>
<li>64-bit applications and clients are now supported. This changed several function signatures:<ul>
<li><a class="el" href="dr__ir__instr_8h.html#a1cd4d0740eb0a0bcd2d387685719263c">instr_encode()</a></li>
<li><a class="el" href="dr__ir__utils_8h.html#a813105fc7196a85e73580d1adfb8d336">decode_next_pc()</a></li>
<li><a class="el" href="dr__ir__utils_8h.html#a2a8b8756bdc063a88d206f17cc5e3e2c">decode_sizeof()</a></li>
<li><a class="el" href="dr__ir__utils_8h.html#aa9055369e97457b8656fc8c3c0d6d49d">decode_eflags_usage()</a></li>
<li><a class="el" href="dr__ir__instr_8h.html#a77b55daa2b3780d2c07e33b8330b2f62">instr_init()</a></li>
<li>The binary trace dump format changed.</li>
</ul>
Several new functions were added:<ul>
<li><a class="el" href="dr__ir__utils_8h.html#adf9a4f63eafc7f9725f7d5bf1725ab5c">set_x86_mode()</a></li>
<li><a class="el" href="dr__ir__utils_8h.html#aa18c8ca0720c97403a0fa9371ae792e5">get_x86_mode()</a></li>
<li><a class="el" href="dr__ir__instr_8h.html#a74814111812ff20b281f7350fb626746">instr_set_x86_mode()</a></li>
<li><a class="el" href="dr__ir__instr_8h.html#acf3a5a5abd40c0c0694f037fcfac5705">instr_get_x86_mode()</a></li>
<li><a class="el" href="dr__ir__opnd_8h.html#a429f69f7bc430cf278b5702818b25fcc">opnd_create_rel_addr()</a></li>
<li><a class="el" href="dr__ir__opnd_8h.html#a5378f9a33c968e32ac7ebc9acb8db3bb">opnd_create_far_rel_addr()</a></li>
<li><a class="el" href="dr__ir__opnd_8h.html#a17c7a1b3e5a6eecdfdb5bf69cdf2ecd4">opnd_is_rel_addr()</a></li>
<li><a class="el" href="dr__ir__opnd_8h.html#ad32e874a224106f72dc50e8441752f3f">opnd_is_near_rel_addr()</a></li>
<li><a class="el" href="dr__ir__opnd_8h.html#a3ee3109f51ef2301b3dc7a1a6b56a496">opnd_is_far_rel_addr()</a></li>
<li><a class="el" href="dr__ir__instr_8h.html#a7c2b7bfe6c9670ac127a24ea7aef33d4">instr_has_rel_addr_reference()</a></li>
<li><a class="el" href="dr__ir__instr_8h.html#a19b43ab8c3edd905329429075e91ea1a">instr_get_rel_addr_target()</a></li>
<li><a class="el" href="dr__ir__instr_8h.html#ae9e4c9cbe4890f8e37af9e299affc86c">instr_get_rel_addr_dst_idx()</a></li>
<li><a class="el" href="dr__ir__instr_8h.html#a8942eef70af97b8018b31df431ef1822">instr_get_rel_addr_src_idx()</a></li>
<li><a class="el" href="dr__ir__instr_8h.html#ae0db1cec99a6fff7dde7201a87ca8892">instr_shrink_to_32_bits()</a></li>
<li><a class="el" href="dr__ir__opnd_8h.html#a493afa708803ec99988e8e0f02a4b554">opnd_shrink_to_32_bits()</a></li>
<li><a class="el" href="dr__ir__opnd_8h.html#a6d6aa6e0596070095845e0214c4a08e8">reg_32_to_64()</a></li>
<li><a class="el" href="dr__ir__opnd_8h.html#a887f5c54d733c30ceb6a943d9a9427db">reg_64_to_32()</a></li>
<li><a class="el" href="dr__ir__opnd_8h.html#a80fb7f17bae1dc1cf6b8a45a9a3b42a3">reg_is_extended()</a></li>
<li><a class="el" href="dr__ir__opnd_8h.html#ae895cb370884b8acc4cdfc523f1101df">reg_parameter_num()</a></li>
</ul>
To build a 64-bit client, set the <code>X86_64</code> preprocessor define before including the DynamoRIO header files, and link with the 64-bit build of DynamoRIO (for a 32-bit client, set <code>X86_32</code>).</li>
<li>Multiple clients are now supported. This changed the signatures of <a class="el" href="dr__api_8h.html#a20a4dc9da7f6bb9121e30bb3570c6961">dr_init()</a>, <a class="el" href="dr__tools_8h.html#a10831623706378cfc3082c0e27e31c4c">dr_get_options()</a>, and <a class="el" href="dr__tools_8h.html#afb7d403eb032bd14ae78807ae3d59ea0">dr_get_client_path()</a>. It also changed how clients are deployed and nudged, and how events are unregistered: explicit unregistration routines are now used.</li>
<li>State translation in the presence of clients is now fully supported. This changed the signature for the basic block and trace event callbacks (see <a class="el" href="dr__events_8h.html#a043a3588c4cf0c2d6838140fce530e72">dr_register_bb_event()</a> and <a class="el" href="dr__events_8h.html#a88a19a6822654caf18c017e145f48a57">dr_register_trace_event()</a>), added a new event <a class="el" href="dr__events_8h.html#ae7a179ac7a2d01157e1ab2852f50c902">dr_register_restore_state_event()</a>, and added new functions <a class="el" href="dr__ir__instr_8h.html#af1beda2d570ba04d74ca9cbd7c31bb1d">instr_set_translation()</a>, <a class="el" href="dr__ir__instr_8h.html#a5206d055a5b06435bd5e919da40e8bd4">instr_set_meta_no_translation()</a>, and <a class="el" href="dr__ir__macros_8h.html#ad21fbdff8a5631b3e31b8221180a2a9c">INSTR_XL8()</a>.</li>
<li>The trace callback (<a class="el" href="dr__events_8h.html#a88a19a6822654caf18c017e145f48a57">dr_register_trace_event()</a>) now presents original application code to the client, rather than code that has already been modified for execution in the code cache. The client also has flexibility in which instrumentation is included from constituent basic blocks added to a trace (the <code>for_trace</code> parameter: see <a class="el" href="dr__events_8h.html#a043a3588c4cf0c2d6838140fce530e72">dr_register_bb_event()</a>).</li>
<li>Fast system calls (syscall and sysenter) are now supported on Linux.</li>
<li>Module load/unload events and module iteration are now supported on Linux.</li>
<li>System calls for 32-bit applications on 64-bit kernels are no longer hidden by vsyscall; related functions were removed: instr_is_lol64_syscall(), instr_is_32on64_syscall().</li>
<li>Due to both 64-bit support and full WOW64 (32-bit applications on 64-bit Windows) support, xmm registers were added to dr_mcontext_t, and a new function <a class="el" href="dr__ir__utils_8h.html#a5921c4f301ea05885f305f9a30b3c0b0">dr_mcontext_xmm_fields_valid()</a> was added.</li>
<li>Far instr-type operands are now supported: <a class="el" href="dr__ir__opnd_8h.html#a95f47d1d589d4a9566a581588fecaedf">opnd_create_far_instr()</a>, <a class="el" href="dr__ir__opnd_8h.html#aee97636116eb65baace7ccd74b8d1083">opnd_is_near_instr()</a>, <a class="el" href="dr__ir__opnd_8h.html#a93533e9bd0ad51af0f0f8d10535a7b0e">opnd_is_far_instr()</a>.</li>
<li>Miscellaneous new functions were added:<ul>
<li><a class="el" href="dr__ir__instr_8h.html#a33a349e086f96bb03bd6700129dc6135">instr_convert_short_meta_jmp_to_long()</a></li>
<li><a class="el" href="dr__ir__instr_8h.html#a5229b3775a4b2cdaa9aa257a27a0be1a">instr_reads_from_reg()</a></li>
<li><a class="el" href="dr__ir__macros_8h.html#a8104e895719c1f3a8558067b023cf9c5">LOCK()</a></li>
<li><a class="el" href="dr__ir__macros_8h.html#a39cadf7c35d28a1dedf9b945cf1aa656">OPND_CREATE_INT_32OR8()</a></li>
<li><a class="el" href="dr__ir__macros_8h.html#a4cb280d756b701b7b2379045b51b0d5a">OPND_CREATE_INT_16OR8()</a></li>
<li><a class="el" href="dr__ir__utils_8h.html#a824eaa9075a7aaf443b4cc4180eec81e">instrlist_meta_append()</a></li>
<li><a class="el" href="dr__tools_8h.html#a54934632c814904bd9e0ce9c83980466">dr_using_all_private_caches()</a></li>
</ul>
</li>
<li>The type of nudge arguments was changed from (void *) to uint64.</li>
<li>The signature of <a class="el" href="dr__tools_8h.html#a4892d089da710e952a23055bd7db38af">dr_lookup_module()</a> changed. It no longer has an IMAGE_SECTION_HEADER out argument. See <a class="el" href="dr__tools_8h.html#ac520aa05555ecbf9e525de582d4baa8c">dr_lookup_module_section()</a> for that functionality.</li>
<li>The disassemble-from-address routines now return NULL when pointed at invalid instructions (matching the decode routines).</li>
<li>The routines to access DynamoRIO tls slots from the cache were changed. dr_insert_write_temp_tls was eliminated in favor of a generalized <a class="el" href="dr__ir__utils_8h.html#af294ac021c84f5ec47230ee7df0e6c02">dr_save_reg</a> with more flexibility on which slot can be used. <a class="el" href="dr__ir__utils_8h.html#a44636ca6809a9fb22cf817701de9ee09">dr_save_arith_flags</a> was similarly generalized. Slots are now guaranteed to remain valid until the next non-meta instruction allowing access to saved registers during clean calls via <a class="el" href="dr__ir__utils_8h.html#abb63ecfaa5256688bab9a2921fc19227">dr_read_saved_reg</a> and <a class="el" href="dr__ir__utils_8h.html#abf8d50d718883a1caf6a2de0fb3dbce3">dr_write_saved_reg</a>. <a class="el" href="dr__ir__utils_8h.html#a919e2106df67eaaa5bc6c49d736543b5">dr_insert_mbr_instrumentation</a> also now requires caller to specify the spill slot to be clobbered which must be less than <a class="el" href="dr__ir__utils_8h.html#a762389f8ae9d809fd7b8f1418cdbd5ae">dr_max_opnd_accessible_spill_slot()</a>.</li>
</ul>
<hr/>
 The major changes between the 0.9.5 and 0.9.4 releases are:</p>
<ul>
<li>The basic block hook (<a class="el" href="API_BT.html#sec_events_bb">Basic Block Creation</a>) passes completely unmodified application code to the client (no mangling or elision).</li>
<li>The old client hook exports have been replaced with an explicit event registration model.</li>
<li>Instruction representation simplification: the client only sees fully decoded instructions.</li>
<li>Easier-to-use clean calls (see <a class="el" href="dr__ir__utils_8h.html#ae7b7bd1e750b8a24ebf401fb6a6d6d5e">dr_insert_clean_call</a>).</li>
<li>Library support (-wrap on linux, ntdll on windows: see <a class="el" href="using.html#sec_extlibs">Using External Libraries</a> and <a class="el" href="using.html#sec_utils">Common Utilities</a>).</li>
<li>Some features have been removed (these are easily implemented by a client): there is no more edge-counting profile build, no more custom exit stubs, and no more prefixes.</li>
<li>Infrastructure improvements:<ul>
<li>Thread-shared caches (can still request thread-private: <a class="el" href="using.html#op_thread_priv">-thread_private option</a>). Note that there are some subtle changes stemming from using thread-shared: in particular, note that the context passed to the deletion event may be NULL (see <a class="el" href="dr__events_8h.html#a698501b03d64f07e1a32fc82c021b27a">dr_register_delete_event</a>).</li>
<li>Direct access to TLS slots (<a class="el" href="dr__ir__utils_8h.html#af294ac021c84f5ec47230ee7df0e6c02">dr_save_reg</a>, dr_insert_write_temp_tls, <a class="el" href="dr__ir__utils_8h.html#a982089284bd51339f448ec4b3928d3b4">dr_insert_write_tls_field</a>).</li>
</ul>
</li>
<li>Module events (<a class="el" href="dr__events_8h.html#aca6b098123ef80cae05ce767a7dd9d98">dr_register_module_load_event</a>), module iteration (<a class="el" href="dr__tools_8h.html#a3310b1bfc22da285af72b1a4a9d10945">dr_module_iterator_start</a>, <a class="el" href="dr__tools_8h.html#a4892d089da710e952a23055bd7db38af">dr_lookup_module</a>, etc.), and memory querying (<a class="el" href="dr__tools_8h.html#ad158d2822dd8bb9caa9604d84b666bfa">dr_query_memory</a>, <a class="el" href="dr__tools_8h.html#a55ca77553e86a0656dc186ae3fc8222f">dr_virtual_query</a>).</li>
<li>The full API is now documented in html and pdf for easy browsing.</li>
<li>Numerous type and routine name changes.</li>
</ul>
 
<table width=100% bgcolor="#000000" cellspacing=0 cellpadding=2 border=0>
  <tr><td><table width=100% bgcolor="#0000C0" cellspacing=0 cellpadding=1 border=0>
  <tr><td><table width=100% bgcolor="#0000C0" cellspacing=0 cellpadding=1 border=0>
  <tr><td></td></tr></table></td></tr></table></td></tr></table>
 <h1><a class="anchor" id="sec_limits"></a>
Limitations</h1>
<h2><a class="anchor" id="sec_limit_clients"></a>
Client Limitations</h2>
<p>The most important limitation on a client is that it remain transparent. This is described fully in <a class="el" href="transparency.html">Client Transparency</a>. Here we summarize the key points to remain transparent:</p>
<ul>
<li>For full transparency, the client should be a self-contained library with linkage to nothing other than DynamoRIO libraries. We provide private loading that makes some use of system libraries safe, but global resource conflicts can still occur and clients are cautioned from using system-interacting library routines. See <a class="el" href="using.html#sec_extlibs">Using External Libraries</a> for further details.</li>
<li>Currently, the communication API provided by DynamoRIO is limited to file I/O and nudges.</li>
</ul>
<h2><a class="anchor" id="sec_limit_platforms"></a>
Platform Limitations</h2>
<ul>
<li>This version of DynamoRIO supports Windows 8 and 8.1. However, systemwide injection (-syswide_on) is not yet supported on Windows 8 or 8.1.</li>
<li>DynamoRIO currently supports the following NT-based 32-bit Windows systems: XP (32-bit, service packs 0-3), 2003 (32-bit, service packs 0-2), Vista (32-bit, service packs 0-1), Windows 7 (32-bit, service packs 0-1), Windows 8, and Windows 8.1. It does not support Windows 95, 98, or ME. It no longer officially supports NT (all service packs) or 2000 (all service packs), although the core DynamoRIO library should still work there: it is only the tools and utility programs that will fail to run. Windows Server 2008 is expected to work but has not been tested.</li>
<li>This release of DynamoRIO supports running 32-bit Windows applications on the following 64-bit Windows operating systems: Windows XP Professional x64 (service pack 2), Windows 2003 x64 (service pack 2), Vista x64 (service packs 0-1), Windows 7 (service packs 0-1), Windows Server 2008, Windows 8, and Windows 8.1. Only the 32-bit code will be seen, and child processes created will not be injected into. On 64-bit Windows 32-bit applications are automatically run through the Windows-On-Windows or WOW64 emulator so system call and indirect call processing clients must be aware of <a class="el" href="dr__ir__instr_8h.html#a4a4d5454f266483029bd88e5a17e398c">instr_is_wow64_syscall()</a>. <a class="anchor" id="limits_64bit"></a></li>
<li>This release of DynamoRIO supports running 64-bit Windows applications, using the 64-bit DynamoRIO build, on the following 64-bit Windows systems: Windows XP Professional x64 (service pack 2), Windows 2003 x64 (service pack 2), Vista x64 (service packs 0-1), Windows 7 x64 (service packs 0-1), Windows 8, and Windows 8.1. Windows Server 2008 is expected to work but has not been tested.</li>
<li>DynamoRIO does not support any Itanium based Windows systems.</li>
<li>This release does not fully support applications that mix 32-bit and 64-bit code. Future releases will support such mixtures.</li>
<li>When running a cygwin application under control of DynamoRIO, stderr and stdout output from DynamoRIO or its clients may not be visible.</li>
<li>UTF-8 support is not yet present in drinjectlib, drconfiglib, drrun.exe, drconfig.exe, or drdeploy.exe. It is present in the core DR API.</li>
<li>This release of DynamoRIO has support for most 32-bit and 64-bit Linux distributions running on Intel-compatible hardware, including Ubuntu and Fedora.</li>
<li>This release of DynamoRIO has support for running 32-bit Linux applications on 64-bit Linux operating systems on AMD64-compatible hardware.</li>
<li>Cross-architecture execve (e.g., a 32-bit process performing execve of a 64-bit executable) may stop working if the paths to the libdynamorio.so and libdrpreload.so libraries are renamed.</li>
</ul>
<h2><a class="anchor" id="sec_limit_perf"></a>
Performance Limitations</h2>
<ul>
<li>In order to present a more straightforward code stream to clients, DynamoRIO has several optimizations disabled in this release. System-call-heavy applications are the ones most likely to be affected. Future releases may allow clients to choose performance versus visibility. This release does provide the <a class="el" href="using.html#op_memory">-opt_memory option</a> to enable prioritizing memory usage and the <a class="el" href="using.html#op_speed">-opt_speed option</a> to prioritize performance at the cost of more complex basic blocks that cross control transfers.</li>
<li>The performance when starting up large desktop applications may be noticeably worse than native. Upcoming releases will address this issue. - The performance when running Java, .Net, Flash or similar managed execution applications can be noticeably worse then native. This can include applications that load these components as in-process plugins (such as Internet Explorer). Upcoming releases will address this issue. - When using DynamoRIO on all or many processes on a system simultaneously, memory usage may become a factor. Upcoming releases will address this issue. </li>
</ul>
<h2><a class="anchor" id="sec_limit_deploy"></a>
Deployment Limitations</h2>
<ul>
<li>The dr_config.lib library is not multi-thread safe. Users of the library should ensure that no more then one thread accesses the library at a time.</li>
<li>Other installed software that uses hooks may not always be interoperable with DynamoRIO.</li>
<li>Other installed software may conflict with DynamoRIO's use of the <code>\HKLM\SOFTWARE\Microsoft\Windows\WindowsNT\CurrentVersion\AppInit_DLLs</code> registry key (only very rarely an issue), which is used for the -syswide_on feature.</li>
<li>On Windows 7 and Windows Server 2008 R2, the digital signature requirement for AppInit_DLLs libraries is disabled when systemwide injection is requested (-syswide_on). This can be a security concern.</li>
<li>On Windows 8 or 8.1, system wide injection (-syswide_on) is not yet supported.</li>
<li>Cygwin processes may not work with DynamoRIO due to cygwin's implementation of fork being incompatible with DynamoRIO.</li>
<li>A Windows application that does not statically link with user32.dll will not be run under control of DynamoRIO using system-wide injection unless its parent process (typically cmd.exe or explorer.exe, for manually launched applications) is already under DynamoRIO control . Only some small non-graphical applications do not link with user32.dll.</li>
<li>When invoking an application in any way that is not from a parent process under DynamoRIO control, DynamoRIO takes control a little later and in some rare cases the application has already created a new thread. This is in violation of the Windows specficiations, but cygwin processes do this. This new thread will not be under DynamoRIO control and can cause a variety of problems. In such cases it is best to invoke from a parent process under DynamoRIO control. However, for 32-bit applications on 64-bit Windows operating systems, DynamoRIO takes over later even from the parent. Future releases will address this limitation.</li>
<li>This release does not support running some Windows services under control of DynamoRIO: the "System" process, smss.exe, csrss.exe, and protected processes on Windows Vista. <a class="anchor" id="limits_vista_service_messagebox"></a></li>
<li>On Windows Vista most services are run in a separate session as a security feature. This means that neither DynamoRIO nor its client will be able to display a messagebox when running in said services (they have no associated visible window station). See <a class="el" href="dr__tools_8h.html#ad444a204e7ca45f9965cfe973470375a">dr_messagebox()</a>.</li>
<li>On Windows Vista the code from certain dlls (found mostly in services) and the code subsequently called from those dlls is run natively and is not visible to the instrumentation APIs. This only applies to dlls that have a .pexe section (only 13 dlls have such a section in a standard Vista install) which seems to be associated with a likely obfuscation method involving kernel side components that this release has no other workaround for. <a class="anchor" id="limits_linux_preload"></a></li>
<li>On Linux, the official deployment method in this release (aside from the <a class="el" href="API_BT.html#sec_startstop">app_start() app_stop()</a> interface, which requires soure code modification) is LD_PRELOAD. This method does not support static binaries, but an experimental injection method which can be enabled with the <code>-early</code> flag does. Binaries with the suid or sgid permission bits set disallow absolute paths in LD_PRELOAD and ignore LD_LIBRARY_PATH, so alternate methods of specifying the path are needed there. One method is to place libdrpreload.so's full path in /etc/ld.so.preload and copy libdynamorio.so to /usr/lib or some other system search directory. You'll need to use a <a class="el" href="page_deploy.html#lin_deploy">separate configure step approach</a>. Don't forget to run drconfig to create a configuration for the application first; otherwise, libdrpreload.so will refuse to take control.</li>
<li>On Linux, the private loader will fail to load libpthread.so. Therefore clients and the libraries they use cannot link against libpthread.so.</li>
</ul>
 
<table width=100% bgcolor="#000000" cellspacing=0 cellpadding=2 border=0>
  <tr><td><table width=100% bgcolor="#0000C0" cellspacing=0 cellpadding=1 border=0>
  <tr><td><table width=100% bgcolor="#0000C0" cellspacing=0 cellpadding=1 border=0>
  <tr><td></td></tr></table></td></tr></table></td></tr></table>
 <h1><a class="anchor" id="sec_future"></a>
Plans for Future Releases</h1>
<p>We hope to include the following major features in future releases:</p>
<ul>
<li>Libraries to facilitate building tools that use shadow memory, examine system calls, and insert heavyweight instrumentation</li>
<li>Earliest Windows injection. Today drinject injects fairly late; from a parent process, injection is very early (before kernel32.dll is loaded), but we plan to provide injection at the very first user-mode instruction in the future.</li>
<li>More flexible (earlier, or later via attach) Linux injection</li>
<li>Persistent and process-shared code caches</li>
<li>Full control over trace building</li>
</ul>
<p>To discuss current and future features, join the <a href="http://groups.google.com/group/dynamorio-users/">DynamoRIO Users group</a>. </p>
</div></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
  <ul>
    <li class="footer" style="float:none;text-align:center"><img border=0 src="favicon.png"> &nbsp;  DynamoRIO API version 5.0.0 --- Wed Sep 10 2014 21:36:44 &nbsp; <img border=0 src="favicon.png">
</small></address>
<!--END !GENERATE_TREEVIEW-->
</body>
</html>
